Submission #1982272
Source Code Expand
#include<cstdio>
#include<vector>
#define pb push_back
const int MaxN=100010,mod=10000019;
int N,a[MaxN],b[MaxN],c[MaxN],d[MaxN];
struct item{
int ty,u,v,x;item*next;
bool eq(int a,int b){return u==a&&v==b||u==b&&v==a;}
int h(){return(1ll*(u<v?u:v)*N+(u>v?u:v))%mod;}
}E1[MaxN],E2[MaxN],*fir[mod];
int op[MaxN],Q[MaxN],*head=Q,*tail=Q;
void mov(item*e,int x,int y){
item*it=fir[e->h()];
if(it==e)fir[e->h()]=e->next;
else if(it){
while(it->next!=e)it=it->next;
it->next=e->next;
}
e->u=x;e->v=y;
e->next=fir[e->h()];
fir[e->h()]=e;
}
struct edge{int id,to;edge*rev,*next;};
struct tree{
edge E[MaxN*2],*ne=E,*first[MaxN];
int deg[MaxN];
bool del[MaxN];
void link(int id,int u,int v){
*ne=(edge){id,v,ne+1,first[u]};first[u]=ne++;
*ne=(edge){id,u,ne-1,first[v]};first[v]=ne++;
deg[u]++;deg[v]++;
}
void rm(int e,int u,int v){
del[e]=1;
deg[u]--;deg[v]--;
}
void mig(int u,int v,bool ty){ // u->v
for(edge*e=first[u],*ex;e;e=ex){
ex=e->next;
if(del[e->id])continue;
e->rev->to=v;
int&x=(ty?c:a)[e->id],&y=(ty?d:b)[e->id];
x==u?x=v:y=v;
if(ty){
mov(E2+e->id,x,y);
if(!op[e->id])
for(item*it=fir[E2[e->id].h()];it;it=it->next)
if(!it->ty&&it->eq(x,y))op[*tail++=e->id]=it->x;
}
else{
mov(E1+e->id,x,y);
for(item*it=fir[E1[e->id].h()];it;it=it->next)
if(it->ty&&!op[it->x]&&it->eq(x,y))op[*tail++=it->x]=e->id;
}
e->next=first[v];
first[v]=e;
}
deg[v]+=deg[u];
deg[u]=0;
}
}T1,T2;
bool get_dup(int&e1,int&e2){
if(head==tail)return 0;
e1=op[e2=*head++];
return 1;
}
bool solve(){
for(int i=1;i<N;i++){
E1[i]=(item){0,a[i],b[i],i,0};
E1[i].next=fir[E1[i].h()];
fir[E1[i].h()]=E1+i;
}
for(int i=1;i<N;i++){
E2[i]=(item){1,c[i],d[i],i,0};
for(item*it=E2[i].next=fir[E2[i].h()];it;it=it->next)
if(it->eq(c[i],d[i])&&!op[i])op[*tail++=i]=it->x;
fir[E2[i].h()]=E2+i;
}
for(int t=N;--t;){
int e1,e2,u,v;
if(!get_dup(e1,e2))return 0;
u=a[e1],v=b[e1];
T1.rm(e1,u,v);
T2.rm(e2,u,v);
if(T1.deg[u]+T2.deg[u]>T1.deg[v]+T2.deg[v]){
int w=u;u=v;v=w;
}
T1.mig(u,v,0);
T2.mig(u,v,1);
}
return 1;
}
int main(){
scanf("%d",&N);
for(int i=1;i<N;i++)scanf("%d%d",a+i,b+i),T1.link(i,a[i],b[i]);
for(int i=1;i<N;i++)scanf("%d%d",c+i,d+i),T2.link(i,c[i],d[i]);
puts(solve()?"YES":"NO");
}
Submission Info
Submission Time |
|
Task |
E - Blue and Red Tree |
User |
mn3twe |
Language |
C++14 (GCC 5.4.1) |
Score |
1400 |
Code Size |
2411 Byte |
Status |
AC |
Exec Time |
119 ms |
Memory |
97280 KB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:94:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&N);
^
./Main.cpp:95:64: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for(int i=1;i<N;i++)scanf("%d%d",a+i,b+i),T1.link(i,a[i],b[i]);
^
./Main.cpp:96:64: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for(int i=1;i<N;i++)scanf("%d%d",c+i,d+i),T2.link(i,c[i],d[i]);
^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
1400 / 1400 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample1.txt, sample2.txt, sample3.txt |
All |
sample1.txt, sample2.txt, sample3.txt, in1.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in2.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in3.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in4.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt, in5.txt, in6.txt, in7.txt, in8.txt, in9.txt, sample1.txt, sample2.txt, sample3.txt |
Case Name |
Status |
Exec Time |
Memory |
in1.txt |
AC |
3 ms |
12416 KB |
in10.txt |
AC |
63 ms |
97280 KB |
in11.txt |
AC |
104 ms |
97280 KB |
in12.txt |
AC |
101 ms |
97280 KB |
in13.txt |
AC |
104 ms |
97280 KB |
in14.txt |
AC |
101 ms |
97280 KB |
in15.txt |
AC |
102 ms |
97280 KB |
in16.txt |
AC |
101 ms |
97280 KB |
in17.txt |
AC |
101 ms |
97280 KB |
in18.txt |
AC |
103 ms |
97280 KB |
in19.txt |
AC |
103 ms |
97280 KB |
in2.txt |
AC |
3 ms |
12416 KB |
in20.txt |
AC |
103 ms |
97280 KB |
in21.txt |
AC |
99 ms |
97280 KB |
in22.txt |
AC |
102 ms |
97280 KB |
in23.txt |
AC |
103 ms |
97280 KB |
in24.txt |
AC |
103 ms |
97280 KB |
in25.txt |
AC |
103 ms |
97280 KB |
in26.txt |
AC |
110 ms |
97280 KB |
in27.txt |
AC |
119 ms |
97280 KB |
in28.txt |
AC |
113 ms |
97280 KB |
in29.txt |
AC |
104 ms |
97280 KB |
in3.txt |
AC |
3 ms |
12416 KB |
in30.txt |
AC |
113 ms |
97280 KB |
in31.txt |
AC |
99 ms |
97280 KB |
in32.txt |
AC |
104 ms |
97280 KB |
in33.txt |
AC |
103 ms |
97280 KB |
in34.txt |
AC |
104 ms |
97280 KB |
in35.txt |
AC |
98 ms |
97280 KB |
in36.txt |
AC |
98 ms |
97280 KB |
in37.txt |
AC |
100 ms |
97280 KB |
in38.txt |
AC |
101 ms |
97280 KB |
in39.txt |
AC |
104 ms |
97280 KB |
in4.txt |
AC |
64 ms |
97280 KB |
in40.txt |
AC |
101 ms |
97280 KB |
in41.txt |
AC |
107 ms |
97280 KB |
in42.txt |
AC |
98 ms |
97280 KB |
in43.txt |
AC |
100 ms |
97280 KB |
in44.txt |
AC |
98 ms |
97280 KB |
in45.txt |
AC |
99 ms |
97280 KB |
in46.txt |
AC |
98 ms |
97280 KB |
in47.txt |
AC |
97 ms |
97280 KB |
in5.txt |
AC |
64 ms |
97280 KB |
in6.txt |
AC |
100 ms |
97280 KB |
in7.txt |
AC |
64 ms |
97280 KB |
in8.txt |
AC |
63 ms |
97280 KB |
in9.txt |
AC |
64 ms |
97280 KB |
sample1.txt |
AC |
3 ms |
12416 KB |
sample2.txt |
AC |
3 ms |
12416 KB |
sample3.txt |
AC |
3 ms |
12416 KB |