​Problem - C2 - Codeforces​

张开发
2026/4/21 11:24:41 15 分钟阅读

分享文章

​Problem - C2 - Codeforces​
Problem - C2 - Codeforces这道题我们要保证每个连续k的区间 通过将b中的-1 赋值来实现达到a的重排对于一个长度为k的区间[l,r-1] 如果区间合法 区间向右移动后 想要依旧合法 需要满足albl arbr或者alar blbr因此我们可以数组切割成连续的k长 的段 也就是k分段点 ai aik ai2k ai3k 根据前面的推导 如果a中的元素全部相同 那么需要b中的元素也全部相同 与a 相同 如果a中不相同 就需要有 aibi最后检查一下赋值数目是否大于原来的数组的数目 如果大于 则不成立代码如下#include bits/stdc.h using namespace std; void solve(){ int n,k; cinnk; vectorinta(n1),b(n1); for(int i1;in;i){ cina[i]; } for(int i1;in;i){ cinb[i]; } vectorboolvis(n1); vectorintpos(k1); mapint,intcnt; for(int i1;ik;i){ pos[i]a[i]; for(int jik;jn;jk){ if(pos[i]!a[j])pos[i]-1; } if(pos[i]!-1)cnt[pos[i]]; if(pos[i]-1){ for(int ji;jn;jk){ if(b[j]!-1b[j]!a[j]){ coutNO\n;return ; } } } } mapint,intcnt2; vectorintans(k1); for(int i1;ik;i){ if(pos[i]!-1){ setintd; for(int ji;jn;jk){ d.insert(b[j]); } d.erase(-1); if(d.size()2){ for(int ji;jn;jk){ if(b[j]!-1b[j]!a[j]){ coutNO\n;return ; } } } if(d.size()1){ cnt2[*d.begin()]; } } } for(auto [v,x]:cnt2){ if(xcnt[v]){ coutNO\n; return ; } } coutYES\n; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cint; while(t--)solve(); return 0; }

更多文章