写了一个特别麻烦的做法

首先一共有三种情况:1.删掉一个叶子,2.删掉根的一个儿子,3.其他的节点

第一种情况会有两个度数为2的节点,第二种情况没有度数为2的节点,第三种情况会有一个度数为4的节点

然后从现在开始降智..

首先求一下每个点的size,从被删除的点开始一直到根的size都会比正常情况少1,如果遇见既不是正常大小也不是正常大小-1的点直接输出0

如果大小不对的点个数不对输出0

这样就可以处理1和3.单独特判掉2就行


官方题解只要找一下直径就能盘段是不是0

有道理。。


  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. const int M = 1000001;
  8. int n,m,k,a[M],s[M],N,ver[M],nex[M],head[M],cnt,dp[M],vis[M],S2,S4,x,y,d[M];
  9. queue<int>q,rs;
  10. void add(int x,int y)
  11. {
  12. ver[++cnt]=y, nex[cnt]=head[x], head[x]=cnt;
  13. ver[++cnt]=x, nex[cnt]=head[y], head[y]=cnt;
  14. }
  15. int main()
  16. {
  17. scanf("%d",&N); n=(1<<N)-1;
  18. if(N==2)
  19. {
  20. printf("2\n1 2");
  21. return 0;
  22. }
  23. for(int i=1;i<=n-2;i++)
  24. {
  25. scanf("%d%d",&x,&y);
  26. d[x]++, d[y]++;
  27. add(x,y);
  28. }
  29. for(int i=1;i<n;i++)
  30. {
  31. s[i]=1;
  32. if(d[i]==2) S2++;
  33. if(d[i]==4 && S4) { printf("0"); return 0; }
  34. if(d[i]==4) S4=i;
  35. if(d[i]>4) { printf("0"); return 0; }
  36. }
  37. if(S2==2 && S4) { printf("0"); return 0; }
  38. for(int i=1;i<=n-1;i++) if(d[i]==1) s[i]=1,q.push(i);
  39. while(q.size())
  40. {
  41. int x=q.front(); q.pop();
  42. vis[x]=1;
  43. for(int i=head[x];i;i=nex[i])
  44. {
  45. if(vis[ver[i]]) continue;
  46. s[ver[i]]+=s[x]; d[ver[i]]--;
  47. if(d[ver[i]]==1)q.push(ver[i]);
  48. }
  49. }
  50. int x=0,S=0;
  51. for(int i=1;i<n;i++)
  52. {
  53. int k=s[i]+2,g=s[i]+1;
  54. if((g & -g) == g) continue;
  55. if((k & -k) !=k) { printf("0"); return 0; }
  56. if(!x || s[i]<s[x]) x=i;
  57. S++;
  58. }
  59. if(!S2)
  60. {
  61. int B=0;
  62. for(int i=1;i<n;i++) if(s[i]==(n-1)/2) B=i;
  63. if(B)
  64. {
  65. printf("2\n");
  66. printf("%d %d",min(x,B),max(x,B));
  67. return 0;
  68. }
  69. }
  70. int k=s[x]+2,t=-1;
  71. while(k) k>>=1, t++;
  72. if(S!=N-t+1) { printf("0"); return 0; }
  73. if(x) {printf("1\n%d",x); return 0;}
  74. printf("2\n");
  75. for(int i=1;i<n;i++)
  76. {
  77. if(s[i]==(n-1)/2) printf("%d ",i);
  78. }
  79. }

CF1228F的更多相关文章

  1. CF1228F One Node is Gone

    题目链接 问题分析 这题感觉就是有很多种方法,然后一种都写不明白-- 首先分为3种情况: 删了根节点下的一个节点,对应两个答案: 删了一个叶节点,对应一个答案: 删了一个其他节点,对应一个答案. 可以 ...

  2. 在$CF$水题の记录

    CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...

随机推荐

  1. 讲真,下次打死我也不敢随便改serialVersionUID了

    讲真,下次打死我也不敢随便改serialVersionUID了 码农沉思录 码农沉思录 微信号 code-thinker 功能介绍 笔者为国内某知名企业不知名码农,专注Java Web领域多年,有丰富 ...

  2. sublime中使用插件anaconda而在代码中出现方框

    这个标志是说不符合PEP8标准,比如使用了Tab做缩进:一行过长等问题. 可以在可以在 Sublime > Preferences > Package Settings > Anac ...

  3. elasticsearch 父子关系

    ElasticSearch 中的Parent-Child关系和nested模型是相似的, 两个都可以用于复杂的数据结构中,区别是 nested 类型的文档是把所有的实体聚合到一个文档中而Parent- ...

  4. 【知识强化】第五章 传输层 5.2 UDP协议

    这节课我们来学习一下UDP协议. 那在上节课呢我们学了这样一个打油诗. 啊,就是传输层有两个好兄弟,大哥TCP和二弟UDP.大哥很靠谱,二弟不靠谱.那只要说到UDP协议我们就要知道它的一个重要的特点, ...

  5. GeneXus笔记本—城市级联下拉

    最近在交流GeneXus的时候 总是会遇到有城市级联下拉的问题 这里就简单做几种方式 供大家参考参考 第一种就是直接绑定关联信息然后在后者的条件模块设定条件即可 具体如下: 首先我们所需要的表为pro ...

  6. JS 富文本编码、解码

    第一种 escape()和unescape()方法 escape() 方法能够把 ASCII之外的所有字符转换为 %xx 或 %uxxxx(x表示十六进制的数字)的转义序列.从 \u000 到 \u0 ...

  7. 四、IDS4建立Authorization server和Client

    一.准备 创建一个名为QuickstartIdentityServer的ASP.NET Core Web 空项目(asp.net core 2.2),端口5000创建一个名为Api的ASP.NET C ...

  8. Sublime Text 3 - there are no packages available for installation 解决方法

    解决方法: 1. 下载一个channel_v3.json ,  提取码: n2vc 2. 进入以下路径的设置界面 3. 添加代码 , 文件路径以各自下载保存路径为准 ( 重启sublime, 搞定 ! ...

  9. 解决 'express' 不是内部或外部命令,也不是可运行的程序

    express-generator >npm install -g express-generator 就可以了

  10. Es学习第一课,了解基本功能和概念

    Elasticsearch作为这几年最流行的搜索引擎,越来越多的互联网企业都在采用它:作为java开发者来说,如果想进一步提高自己能力,同时也为了能够在实际工作中遇到搜索.存储问题多一个解决方案,学习 ...