写了一个特别麻烦的做法

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

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

然后从现在开始降智..

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

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

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


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

有道理。。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue> using namespace std; const int M = 1000001;
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];
queue<int>q,rs;
void add(int x,int y)
{
ver[++cnt]=y, nex[cnt]=head[x], head[x]=cnt;
ver[++cnt]=x, nex[cnt]=head[y], head[y]=cnt;
} int main()
{
scanf("%d",&N); n=(1<<N)-1;
if(N==2)
{
printf("2\n1 2");
return 0;
}
for(int i=1;i<=n-2;i++)
{
scanf("%d%d",&x,&y);
d[x]++, d[y]++;
add(x,y);
}
for(int i=1;i<n;i++)
{
s[i]=1;
if(d[i]==2) S2++;
if(d[i]==4 && S4) { printf("0"); return 0; }
if(d[i]==4) S4=i;
if(d[i]>4) { printf("0"); return 0; }
}
if(S2==2 && S4) { printf("0"); return 0; }
for(int i=1;i<=n-1;i++) if(d[i]==1) s[i]=1,q.push(i);
while(q.size())
{
int x=q.front(); q.pop();
vis[x]=1;
for(int i=head[x];i;i=nex[i])
{
if(vis[ver[i]]) continue;
s[ver[i]]+=s[x]; d[ver[i]]--;
if(d[ver[i]]==1)q.push(ver[i]);
}
}
int x=0,S=0;
for(int i=1;i<n;i++)
{
int k=s[i]+2,g=s[i]+1;
if((g & -g) == g) continue;
if((k & -k) !=k) { printf("0"); return 0; }
if(!x || s[i]<s[x]) x=i;
S++;
}
if(!S2)
{
int B=0;
for(int i=1;i<n;i++) if(s[i]==(n-1)/2) B=i;
if(B)
{
printf("2\n");
printf("%d %d",min(x,B),max(x,B));
return 0;
}
}
int k=s[x]+2,t=-1;
while(k) k>>=1, t++;
if(S!=N-t+1) { printf("0"); return 0; }
if(x) {printf("1\n%d",x); return 0;}
printf("2\n");
for(int i=1;i<n;i++)
{
if(s[i]==(n-1)/2) printf("%d ",i);
}
}

CF1228F的更多相关文章

  1. CF1228F One Node is Gone

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

  2. 在$CF$水题の记录

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

随机推荐

  1. 《穷爸爸富爸爸——Cashflow》

    读<穷爸爸富爸爸>大约两年前了,当时对理财没什么概念,除了支付宝,就是京东小金库,哪个利率高就存哪个里.记忆中除了感觉这应该是有一定经济基础的人通常做的事,工薪阶级的自己还未达标,工资除了 ...

  2. C++中的内联函数分析

    1,本节课学习 C++ 中才引入的新的概念,内联函数: 2,常量与宏回顾: 1,C++ 中的 const 常量可以替代宏常数定义,如: 1,const int A = 3; <==> #d ...

  3. 04-初始mysql语句

    本节课先对mysql的基本语法初体验. 操作文件夹(库) 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database ...

  4. opencv图像的基本操作3

    1.获取像素并修改 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2. ...

  5. 在tkinter中使用matplotlib

    import sys import tkinter as Tk import matplotlib from numpy import arange, sin, pi from matplotlib. ...

  6. 利用Python语言Appium启动ios app

    首先配置好电脑环境,主要是appium太难配了,不多说 然后,分两步 第一步:启动appium服务器 有三种方法,1.下载appium-desk-top(桌面客户端),启动 2.终端启动:appium ...

  7. linux软件包rpm的使用

    一rpm包管理器 (一)rpm的介绍 rpm不仅是文件的后缀,也是一个工具,外部命令,程序包管理器 功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装.卸载. ...

  8. Cisco基础(二):三层交换vlan间通信、多交换机vlan间通信、三层交换配置路由、RIP动态路由配置、三层交换配置RIP动态路由

    一.三层交换vlan间通信 目标: VLAN实现了广播域的隔离,同时也将VLAN间的通信隔离了.三层交换技术使得VLAN间可以通信. 通过三层交换实现VLAN间通信 方案: 为了解决了传统路由器低速. ...

  9. BN和正则化一起使用的后果

    就是因为 batch norm 过后, weight 影响没那么重了,所以 l2 weight decay 的效果就不明显了. 证明了L2正则化与归一化相结合时没有正则化效应.相反,正则化会影响权重的 ...

  10. 78 Ranking SVM

    0 引言 Ranking-SVM是SVM的一个变种,通过将排序问题转化为二分类问题,并利用标签数据训练特征权重收敛得到特征模型,完成排序任务,是比较经典的机器学习排序算法. 1 中文版介绍 https ...