?
# | 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 |
#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; }
?
?
?
?