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
AC × 3
AC × 53
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