Codeforces Round #968 ABCD1D2 简单记录
__vector__ · · 个人记录
赛时只过了 A,B,C,D1,D2 一个细节写挂了没过,非常遗憾。
A
容易发现
B
通过一些(感觉?)得出答案与数组顺序无关。
数组排序后第
可以略加模拟加以验证,感性理解差不多可以。
严格数学证明不会。
C
贪心方向:尽可能让所有相邻数不同。
一个可行解:
int cnt[26];
void solve(int id_of_test){
scanf("%d",&n);
scanf("%s",s+1);
FOR(i,1,n){
cnt[s[i]-'a']++;
}
vi rem;
FOR(i,0,25){
if(cnt[i])rem.eb(i);
}
while(!rem.empty()){
for(int& id:rem){
cnt[id]--;
pc(id+'a');
}
vi nw;
for(int id:rem){
if(cnt[id]){
nw.eb(id);
}
}
rem=nw;
}
pln;
}
D1
注意到同一个序列操作最大能得到的值是次小未出现的非负数。
对于初始值
也就是说,对于任意
D2
注意到,设同一个序列的最小未出现的非负数为
那么,假设对当前序列操作的初始值为
也就是说,
考虑以此关系建边。
从
对每个序列这样建图,注意到这个图是一个 DAG,用拓扑排序就可以求解每个数能操作跳转到的最大的值,设
另外注意到,对于同一个序列的任意
另外一个坑点:每个数