CF1228F

Я написал особенно неприятную практику

Во-первых, в общей сложности три случая: 1. удалить лист, удалить корень 2 сына и 3 других узлов

Первый случай будет два узла степени 2, без второго узла степени 2, третий случай есть узел степени 4

Тогда теперь падение Ч ..

Во-первых, спросить о размере каждой точке, с точки не будут удалены, пока корневой размер будет 1 меньше, чем обычно, при их удовлетворении, ни размера, ни нормальной точки нормального размера -1 0 прямой выходной

Если номер точки не выводится неправильный размер 0

Такие вещи, как один однозначности и 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);
    }
}

рекомендация

отwww.cnblogs.com/ZUTTER/p/11649736.html