Submission #1796048
Source Code Expand
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cassert>
#include <cctype>
#include <set>
using namespace std;
typedef long long lint;
#define cout cerr
#define ni (next_num<int>())
template<class T>inline T next_num(){
T i=0;char c;
while(!isdigit(c=getchar())&&c!='-');
bool flag=c=='-';
flag?c=getchar():0;
while(i=i*10-'0'+c,isdigit(c=getchar()));
return flag?-i:i;
}
template<class T1,class T2>inline void apmax(T1 &a,const T2 &b){if(a<b)a=b;}
template<class T1,class T2>inline void apmin(T1 &a,const T2 &b){if(b<a)a=b;}
const int N=100010;
int que[N],qh=0,qt=0;
bool inque[N];
namespace seg{
struct Node;
typedef Node* node;
struct Node{
int l,m,r;
node lson,rson;
set<int>e;
bool zero,one;
inline void up(){
if(l==r){
zero=true,one=false;
}else{
zero=lson->zero||rson->zero;
one=lson->one||rson->one;
}
if(e.size()==1){
one=zero,zero=false;
}else if(e.size()>1){
one=zero=false;
}
}
}*rt;
node build(int l,int r){
static node n=new Node[N<<1];
node x=n++;
x->l=l,x->m=(l+r)>>1,x->r=r;
x->zero=true,x->one=false;
if(l!=r){
x->lson=build(l,x->m);
x->rson=build(x->m+1,r);
}
return x;
}
void psh(node x){
assert(x->e.size()==1);
int e=*(x->e.begin());
if(!inque[e]){
inque[e]=true,que[qt++]=e;
}
}
void addque(node x,int upsum=0){
if(upsum||!x->one){
return;
}
if(!x->e.empty()){
psh(x);
}else{
addque(x->lson),addque(x->rson);
}
}
void add(node x,int l,int r,int e,int upsum=0){
if(x->l==l&&x->r==r){
if(e>0){
x->e.insert(e);
x->up();
}else{
x->e.erase(-e);
x->up();
addque(x,upsum);
}
return;
}
upsum+=x->e.size();
if(r<=x->m){
add(x->lson,l,r,e,upsum);
}else if(l>x->m){
add(x->rson,l,r,e,upsum);
}else{
add(x->lson,l,x->m,e,upsum);
add(x->rson,x->m+1,r,e,upsum);
}
x->up();
if(e<0&&x->one&&x->e.size()==1&&upsum-x->e.size()==0){
psh(x);
}
}
}
namespace T{
const int E=N<<1;
int to[E],bro[E],head[N],e=0;
int fa[N],son[N],size[N],dep[N],top[N];
int dfn[N],idx[N],tim=0;
inline void init(){
memset(head,-1,sizeof(head));
memset(son,0,sizeof(son));
fa[1]=size[0]=dep[0]=0;
}
inline void ae(int u,int v){
to[e]=v,bro[e]=head[u],head[u]=e++;
}
inline void add(int u,int v){
ae(u,v),ae(v,u);
}
void dfs1(int x){
dep[x]=dep[fa[x]]+1;
size[x]=1;
for(int i=head[x],v;~i;i=bro[i]){
if((v=to[i])!=fa[x]){
fa[v]=x;
dfs1(v);
size[x]+=size[v];
if(size[v]>size[son[x]]){
son[x]=v;
}
}
}
}
void dfs2(int x){
idx[dfn[x]=++tim]=x;
top[x]=son[fa[x]]==x?top[fa[x]]:x;
if(son[x]){
dfs2(son[x]);
for(int i=head[x],v;~i;i=bro[i]){
if((v=to[i])!=fa[x]&&v!=son[x]){
dfs2(v);
}
}
}
}
inline void alt(int u,int v,int w){
for(;top[u]!=top[v];u=fa[top[u]]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
seg::add(seg::rt,dfn[top[u]],dfn[u],w);
}
if(u!=v){
if(dep[u]<dep[v]){
swap(u,v);
}
seg::add(seg::rt,dfn[v]+1,dfn[u],w);
}
}
}
int u[N],v[N];
int main(){
int n=ni;
T::init();
for(int i=1;i<n;T::add(ni,ni),i++);
seg::rt=seg::build(1,n),T::dfs1(1),T::dfs2(1);
for(int i=1;i<n;T::alt(u[i]=ni,v[i]=ni,i),i++);
memset(inque,0,sizeof(inque));
seg::addque(seg::rt);
for(int i;i=que[qh],qh<qt;qh++){
T::alt(u[i],v[i],-i);
}
for(int i=1;i<n;i++){
if(!inque[i]){
puts("NO");
return 0;
}
}
puts("YES");
return 0;
}
Submission Info
Submission Time |
|
Task |
E - Blue and Red Tree |
User |
sshockwave |
Language |
C++14 (GCC 5.4.1) |
Score |
1400 |
Code Size |
3616 Byte |
Status |
AC |
Exec Time |
1409 ms |
Memory |
126080 KB |
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 |
7 ms |
19584 KB |
in10.txt |
AC |
1404 ms |
88064 KB |
in11.txt |
AC |
379 ms |
41600 KB |
in12.txt |
AC |
371 ms |
41088 KB |
in13.txt |
AC |
407 ms |
41472 KB |
in14.txt |
AC |
386 ms |
41472 KB |
in15.txt |
AC |
375 ms |
41472 KB |
in16.txt |
AC |
367 ms |
40960 KB |
in17.txt |
AC |
390 ms |
41600 KB |
in18.txt |
AC |
368 ms |
41216 KB |
in19.txt |
AC |
372 ms |
41216 KB |
in2.txt |
AC |
6 ms |
19584 KB |
in20.txt |
AC |
394 ms |
41728 KB |
in21.txt |
AC |
499 ms |
45184 KB |
in22.txt |
AC |
449 ms |
45312 KB |
in23.txt |
AC |
480 ms |
46208 KB |
in24.txt |
AC |
484 ms |
46080 KB |
in25.txt |
AC |
460 ms |
46080 KB |
in26.txt |
AC |
391 ms |
41216 KB |
in27.txt |
AC |
397 ms |
41472 KB |
in28.txt |
AC |
406 ms |
41472 KB |
in29.txt |
AC |
402 ms |
41984 KB |
in3.txt |
AC |
7 ms |
19584 KB |
in30.txt |
AC |
434 ms |
41600 KB |
in31.txt |
AC |
1378 ms |
87040 KB |
in32.txt |
AC |
1268 ms |
84224 KB |
in33.txt |
AC |
1303 ms |
85888 KB |
in34.txt |
AC |
1308 ms |
86272 KB |
in35.txt |
AC |
1333 ms |
87040 KB |
in36.txt |
AC |
1383 ms |
89088 KB |
in37.txt |
AC |
1343 ms |
87040 KB |
in38.txt |
AC |
1129 ms |
126080 KB |
in39.txt |
AC |
707 ms |
99584 KB |
in4.txt |
AC |
1409 ms |
89216 KB |
in40.txt |
AC |
874 ms |
112128 KB |
in41.txt |
AC |
1289 ms |
84224 KB |
in42.txt |
AC |
1262 ms |
86016 KB |
in43.txt |
AC |
1250 ms |
83840 KB |
in44.txt |
AC |
1319 ms |
86016 KB |
in45.txt |
AC |
1254 ms |
86272 KB |
in46.txt |
AC |
509 ms |
101760 KB |
in47.txt |
AC |
721 ms |
125312 KB |
in5.txt |
AC |
1385 ms |
88576 KB |
in6.txt |
AC |
749 ms |
123904 KB |
in7.txt |
AC |
1353 ms |
86656 KB |
in8.txt |
AC |
1359 ms |
88960 KB |
in9.txt |
AC |
1361 ms |
88960 KB |
sample1.txt |
AC |
7 ms |
19584 KB |
sample2.txt |
AC |
7 ms |
19584 KB |
sample3.txt |
AC |
7 ms |
19584 KB |