Codeforces functionality may be limited from June 18, 19:00 (UTC) to June 19, 3:00 AM (UTC) due to technical maintenance. Polygon will work as usual. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
230442258 Practice:
racccccoon
1491E - 27 C++14 (GCC 6-32) Accepted 264 ms 7728 KB 2023-10-30 07:00:14 2023-10-30 07:00:14
→ Source
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+10;
int Fib[]={0,1,1,2,3,5,8,13,21,34,55,89,
144,233,377,610,987,1597,2584,4181,6765,
10946,17711,28657,46368,75025,121393,196418};
bool mp[N];
void init_Fibonacci()
{
    for(int i=1;i<=27;i++)
        mp[Fib[i]]=1;
}
int n;
struct edge{int to,nxt;};
edge e[2*N];int head[N],tot;
void add(int u,int v)
{
    e[++tot]={v,head[u]};head[u]=tot;
}
int fa[N],sz[N],dfn[N],rk[N],dc;bool cut[N];
void dfs0(int u,int pa)
{
    fa[u]=pa;sz[u]=1;rk[dfn[u]=++dc]=u;
    for(int i=head[u];i;i=e[i].nxt)
        if ( (e[i].to^pa) and (!cut[e[i].to]) )
            dfs0(e[i].to,u),sz[u]+=sz[e[i].to];
}
bool dfs1(int u)
{
    // printf("dfs %d %d   ",u,sz[u]);
    if(sz[u]==1)
    {
        // puts("is");
        return true;
    }
    if(mp[sz[u]]==0)
    {
        // puts("not");
        return false;
    }
    // printf("in dfs %d %d\n",u,sz[u]);
    for(int i=dfn[u]+1;;)
    {
        // printf("i=%d\n",i);
        int v=rk[i];
        // printf("%d -> %d\n",u,v);
        if(cut[v])
        {
            i+=sz[v];
            // puts("run");
        }
        else if(mp[sz[v]] and mp[sz[u]-sz[v]])
        {
            // printf("\n\n%d to %d\n",u,v);
            
            cut[v]=1;dc=0;dfs0(u,fa[u]);dfs0(v,fa[v]);
            // printf("    %d %d\n",sz[u],sz[v]);
            bool res1=dfs1(u),
                 res2=dfs1(v);
            // printf("%d toto %d,%d\n",u,v,res1&res2);
            return res1 && res2;
        }
        else 
        {
            i++;
            // puts("con");
        }
        if(i>=dfn[u]+sz[u])break;
    }
    // printf(" at %d %d,false\n",u,sz[u]);
    return false;
}
void debug()
{
    return ;
    for(int i=1;i<=n;i++)printf("%d ",fa[i]);puts("");
    for(int i=1;i<=n;i++)printf("%d ",sz[i]);puts("");
    for(int i=1;i<=n;i++)printf("%d ",dfn[i]);puts("");
    for(int i=1;i<=n;i++)printf("%d ",rk[i]);puts("");
}
int main()
{
    init_Fibonacci();
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int u,v;scanf("%d%d",&u,&v);
        add(u,v);add(v,u);
    }
    dfs0(1,0);
    bool ans = dfs1(1);
    puts(ans?"YES":"NO");
    debug();
    return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details