比赛 2024暑假C班集训E 评测结果 WWWWWWWWWWWWWWWWWWWWWWWWWWWWWEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEW
题目名称 部落冲突 最终得分 0
用户昵称 Untitled 运行时间 18.181 s
代码语言 C++ 内存使用 5.66 MiB
提交时间 2024-07-14 10:27:48
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n,m,idx,f[300010],dep[6010],w[6010][2];
  5. bool g[6010][6010],solve2;
  6.  
  7.  
  8. bool judge(int p,int q){
  9. if (dep[p]<dep[q]) swap(p,q);
  10. while (dep[p]>dep[q]){
  11. if (g[f[p]][p]) return 0;
  12. p=f[p];
  13. }
  14. while (p!=q){
  15. if (g[f[p]][p] || g[f[q]][q]) return 0;
  16. p=f[p],q=f[q];
  17. }
  18. return 1;
  19. }
  20.  
  21. int main(){
  22. freopen("lct.in","r",stdin);
  23. freopen("lct.out","w",stdout);
  24. cin.tie(0);cout.tie(0);
  25. int p,q;
  26. char c;
  27. cin>>n>>m;
  28. for (int i=1;i<n;i++){
  29. cin>>p>>q;
  30. if (p<q) swap(p,q);
  31. f[p]=q;
  32. }
  33. if (n>=40000) solve2=1;
  34. if (!solve2) for (int i=2;i<=n;i++) dep[i]=dep[f[i]]+1;
  35. for (int x=1;x<=m;x++){
  36. cin>>c;
  37. if (c=='U') cin>>p;
  38. else cin>>p>>q;
  39. if (c=='Q'){
  40. if (solve2){
  41. if (p>q) swap(p,q);
  42. bool fl=0;
  43. for (int i=1;i<=idx;i++){
  44. if (p<=w[i][0] && w[i][1]<q && g[w[i][0]][w[i][1]]) {
  45. fl=1;
  46. cout<<"No\n";
  47. break;
  48. }
  49. }
  50. if (!fl) cout<<"Yes\n";
  51. }
  52. else if (judge(p,q)) cout<<"Yes\n";
  53. else cout<<"No\n";
  54. }
  55. if (c=='C'){
  56. w[++idx][0]=p,w[++idx][1]=q;
  57. g[p][q]=1,g[q][p]=1;
  58. }
  59. else{
  60. g[w[p][0]][w[p][1]]=0,g[w[p][1]][w[p][0]]=0;
  61. }
  62. }
  63. return 0;
  64. }