专栏文章
NOIP 8/12 题解
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miodiqb4
- 此快照首次捕获于
- 2025/12/02 17:26 3 个月前
- 此快照最后确认于
- 2025/12/02 17:26 3 个月前
T1:
题意概述:
有 次操作,有两种形式:
1.获得 元或 元。
2.获得 元或 元的随机数。
问能不能通过 次操作获得 元。 组数据。
30pts:
枚举。
100pts:
数学题。
的上界是 , 一定无解。考虑变化量,需要构造一种变化量,正好是 。第二种操作的变化量是 。
发现并出来的是一个连续区间 。
考虑第一种操作,每次变化量为 ,所以 ,且 。
代码:
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--){
ll n,x,y,m;
cin>>n>>x>>y>>m;
if(m>n*y){
cout<<"No"<<'\n';
continue;
}
if(n*y-m>=ceil(y/2)&&n*y-m<=n*y){
cout<<"Yes"<<'\n';
continue;
}
if((n*y-m)%(y-x)==0&&(n*(y-x)>n*y-m||n*(y-x)==n*y-m)){
cout<<"Yes"<<'\n';
continue;
}
cout<<"No"<<'\n';
}
return 0;
}
T2:
题意概述:
有一个 点 边的图,原图每个点点权 ,重新分配权值是 。
(1)。
(2)。
(3).
求 。
10pts:
送分。
30pts:
注意到,平均分配是最优的。
根节点要给自己留下 的权值,剩下每个节点分配出 。为什么要平均分配?如果不平均分配,那么就有一个节点大,一个节点小,则如果 ,那么 会更大。所以答案就是 。
60pts:
最坏情况:有一节点无穷大,其他节点权值为 。从 到 枚举一个点有权值,其他点没权值,建出一颗树。二分 ,以每个点为根,做出每个点的深度,求 求和,如果小于 就可以。
时间复杂度 。
100pts:
以 号点为根做出一颗 bfs 树,非树边最多出现在同层或相邻一层,求出最短路径即可。
优化:先跑 bfs 再二分。每个点在 bfs 树的深度时是一样的,所以我们只需要在二分之外再进行 bfs,时间复杂度 。
代码:回去补。
T3:
两个 个字符的字串 ,,只能交换 的两个相邻字符,求最少次数使得 。
5pts:
CPPcout<<-1;
15pts:
CPPcout<<0;
20pts:
找到最小的 s.t. , 不存在就输出 。
60pts:
如何比较 和 ,一位一位比较。
设 和 的 LCP 是 ,则 ,,第一步,枚举 LCP,LCP 中的字符怎么对应?一一对应,选最前面的。如果交换两个相邻字符是不优的。你可以飞快地一一对应完。每次扩展 LCP 时,就把 中的对应位置移到 ,问题就又转换为 性质,我们可以从 往后枚举就行了,时间复杂度为 。
100pts:
对每种字符开一个队列,每次扩展一格的时候,把 的队列的队头取出,就可以建立一个关系,但是不能暴力计算,需要快速计算。
注意到 LCP 是 中最前面的位置,只需要数出星号后有多少个位置往前移动?用树状数组维护,就相当于把 改成 ,求后缀和问题,就可以快速计算贡献。
时间复杂度 。
注意到每次都要查一遍,对于 26 个队头,只需要确定最优的查一次就可以了,时间复杂度 。
T4:
形式化题意:
个点 为根的图,求树的拓扑序的逆序对的个数和。
15pts:
暴力搜索。
25pts:
状压 DP。
表示当前是 状态,能到第 个数的逆序对数量。
时间复杂度 。
100pts:
如果 是 的祖先,则 在拓扑序上一定先于 ,如果 则贡献为 ,否则贡献为 。
一棵树的拓扑序数量就是 。以概率考虑的时候,随机排律满足 号点在它的子树的最前面概率是 ,最后概率乘积再乘上排列数 就得到了数量。
问题转化为期望乘上拓扑序数量。
为祖孙关系已经解决,那如果是非祖先关系呢?
不妨设 ,设 表示 贡献的逆序对个数, 为 到 之间的(不包括 )点数, 为 到 之间的(不包括 )点数。考虑只把 这条链拉出来,最后加的点只可能是 或者 ,如果最后拉出来的是 ,则求的就是 ,那么 成为最后一个点的概率是什么?
设 代表只考虑 子树和 子树相互之间产生逆序对的概率之和。我们只需要算出 子树中有多少个节点编号小于 的。我们只需要预处理出 ,表示 中有多少个点编号小于 的,只需要将 的子树染黑, 的子树染白, 就是黑色中最前面的, 就是白色中最前面的,只需要计算出黑色在最前面的概率。
同理,所以贡献就是 ,所以转移方程就是 。
答案就是枚举 ,如果 都是儿子的话,那么答案就是 之和,再加上祖孙关系的和。
为什么不能直接算概率?若 的子树大, 的子树很小,那么概率就不是 了。
时间复杂度 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...