CF1768
CF1768
A. Greatest Convex
呆呆 A,直接输出 \(n-1\) 就好了。
B. Quick Sort
可怜 B。对于从 \(1\) 开始的递增子序列不需要排序以外,其他都需要。
C. Elemental Decompress
C。事情开始变得有趣起来,被 C 卡了五个小时,正解是对每一行维护一个 set 表示除了强制要选的之外每行可以选啥。
维护一个 \(vis_i\) 表示 \(i\) 这个数出现过多少次。
填法就是如果对于一个最大值,如果他没在第一个序列出现过,那就填在第一个序列,反之第二个序列,然后在第二行的 set lower_bound 一个值填进去,这个时候如果出现过一次那就都删掉,如果没出现过那就仅删掉第二行 set 里的值。
看起来就很对。
附赠对拍 checker:
#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int mx[N],p[N],q[N];
bool vis[N];
int main(){
freopen("qwq.in","r",stdin);
freopen("Error.out","w",stdout);
int T,n;cin>>T>>n;
for(int i=1;i<=n;i++) scanf("%d",&mx[i]);
fclose(stdin);
freopen("std.out","r",stdin);
string s1;cin>>s1;
fclose(stdin);
freopen("qwq.out","r",stdin);
string s2;cin>>s2;
if(s1!=s2) return printf("The Answer in the first Line is Wrong.\n"),0;
if(s1=="NO"){
fclose(stdout);
// cerr<<"Nothing Wrong."<<endl;
return 0;
}
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
for(int i=1;i<=n;i++) scanf("%d",&q[i]);
// for(int i=1;i<=n;i++) printf("%d ",q[i]);
for(int i=1;i<=n;i++) if(mx[i]!=max(p[i],q[i])){
return printf("Wrong OutPut For the max.\n"),0;
}
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1;i<=n;i++) {
if(vis[p[i]]) return printf("Wrong OutPut P is not a Permutation.\n"),0;
vis[p[i]]=1;
}
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1;i<=n;i++) {
if(vis[q[i]]) return printf("Wrong OutPut Q is not a Permutation.\n"),0;
vis[q[i]]=1;
}
fclose(stdout);
// cerr<<"Nothing Wrong."<<endl;
}
D. Lucky Permutation
并查集维护环的关系然后,答案就是 \(n-cnt_环\)。
最后记得看一下存不存在逆序对被调换的情况,存在就 -1,不存在就 +1。

浙公网安备 33010602011771号