AtCoder448总结C D

📅 发布时间:2026/7/8 4:32:06 👁️ 浏览次数:
AtCoder448总结C D
C题目描述每次查询给出K个位置删除这些位置的数据然后求删除后最小的数大题思路K的值很小在5以内所以就干脆直接查看前K小的数据。只需要查询没有被删的最小的数就可以了。如果K是4删除了第1 2 3 5小的数那么明显答案就是[4]。而且我们最多只进行了5次比对这个数据范围是可以接受的。如果正好前K小的数都被删了那么答案就是第K1小的数。#includebits/stdc.h #define ll long long #define ld long double #define rep(i,j,k) for(int ij;ik;i) #define per(i,j,k) for(int ij;ik;i--) #define PII pairll,ll using namespace std; bool cmp(int x,int y){ return xy; } int main(){ int N,Q;cinNQ; vectorintA; vectorintC; for(int i0;iN;i){ int x;cinx; A.push_back(x); C.push_back(x); } sort(A.begin(),A.end()); for(int i0;iQ;i){ int K;cinK; vectorboolB(5,0); for(int j0;jK;j){ int x;cinx; int yC[x-1]; xy; if(xA[0]!B[0]){ B[0]1; continue; } if(xA[1]!B[1]){ B[1]1; continue; } if(xA[2]!B[2]){ B[2]1; continue; } if(xA[3]!B[3]){ B[3]1; continue; } if(xA[4]!B[4]){ B[4]1; continue; } } bool flag0; for(int j0;jK;j){ if(!B[j]){ coutA[j]endl; flag1; break; } } if(!flag)coutA[K]endl; B.clear(); } }写法每次删除查看是不是删除了前K小的数最小的如果是则标记它输出按从小到大查询前K1小的数如果这个数没有被删除就输出它进入下一次查询D题目描述从节点1开始依次访问节点1-N每个节点有存储的数据如果访问路径出现了相同数据就输出Yes没有则输出No。大体思路访问节点如果在某一个节点A出现了和节点B的相同数据那么从这个节点往后再遍历的所有节点都是有重复元素的因为路径包含了A和B正好是深度遍历dfs。#includebits/stdc.h #define ll long long #define ld long double #define rep(i,j,k) for(int ij;ik;i) #define per(i,j,k) for(int ij;ik;i--) #define PII pairll,ll using namespace std; int N; vectorvectorintg; vectorintA; vectorboolvist; vectorboolans; unordered_mapint,intco; void dfs(int x,int f){ co[A[x]]; if(co[A[x]]1||f){ ans[x]1; f1; } for(int i0;ig[x].size();i){ if(!vist[g[x][i]]){ vist[g[x][i]]1; dfs(g[x][i],f); vist[g[x][i]]0; } } co[A[x]]--; } int main(){ cinN; A.push_back(-1); g.resize(N1); for(int i0;iN;i){ int x;cinx; A.push_back(x); } for(int i1;iN;i){ int x;int y; cinxy; g[x].push_back(y); g[y].push_back(x); } vist.resize(N1,0); vist[1]1; ans.resize(N1,0); dfs(1,0); for(int i1;iN1;i){ if(ans[i])coutYesendl; else coutNoendl; } }写法深度优先遍历用unordered_map查询当前有没有重复的元素co[A[x]]1然后标记此节点f1从此节点往后能遍历到的所有节点都是有重复元素的节点能力有限多多包容