题目意思对一个长度为 n 的序列 a可以对其任意一个数进行变化求在让序列所有数中位置 i 的数不能是 i并且序列中有 1 到 n 之间的所有数。思路我们建一个 b 数组存每个数出现的次数。如果他是 0说明这个数需要其他数变化得到。然后往后枚举每一个数如果当前被枚举的数有两个或以上且不和当前位置相等说明可以更换更换一下就好了最后输出。#includebits/stdc.h using namespace std; const int N200005; int T,n,a[N],b[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinT; while(T--){ cinn; for(int i1;in;i){ b[i]0; } for(int i1;in;i){ cina[i]; b[a[i]]; } int id1,ans0; for(int in;i1;i--){ if(!b[i]){ ans; while(b[a[id]]2||iid) id; b[a[id]]--,a[id]i; } } coutn-ans\n; for(int i1;in;i) couta[i] ; cout\n; } return 0; }
CF1530D Secret Santa
题目意思对一个长度为 n 的序列 a可以对其任意一个数进行变化求在让序列所有数中位置 i 的数不能是 i并且序列中有 1 到 n 之间的所有数。思路我们建一个 b 数组存每个数出现的次数。如果他是 0说明这个数需要其他数变化得到。然后往后枚举每一个数如果当前被枚举的数有两个或以上且不和当前位置相等说明可以更换更换一下就好了最后输出。#includebits/stdc.h using namespace std; const int N200005; int T,n,a[N],b[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinT; while(T--){ cinn; for(int i1;in;i){ b[i]0; } for(int i1;in;i){ cina[i]; b[a[i]]; } int id1,ans0; for(int in;i1;i--){ if(!b[i]){ ans; while(b[a[id]]2||iid) id; b[a[id]]--,a[id]i; } } coutn-ans\n; for(int i1;in;i) couta[i] ; cout\n; } return 0; }