Submission #1265604


Source Code Expand

#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<bitset>
#include<utility>
#include<functional>
#include<iomanip>
#include<sstream>
#include<ctime>
#include<cassert>
using namespace std;
#define y0 y0z
#define y1 y1z
#define yn ynz
#define j0 j0z
#define j1 j1z
#define jn jnz
#define tm tmz
#define buli(x) (__builtin_popcountll(x))
#define bur0(x) (__builtin_ctzll(x))
#define bul2(x) (63-__builtin_clzll(x))
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define fil(a,b) memset((a),(b),sizeof(a))
#define cl(a) fil(a,0)
#define siz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++)
#define rep(i,a,b) for (int i=(a),_ed=(b);i<_ed;i++)
#define per(i,a,b) for (int i=(b)-1,_ed=(a);i>=_ed;i--)
#define forg(i,gu) for (int i=gu;~i;i=e[i].next)
#define pw(x) ((ll(1))<<(x))
#define upmo(a,b) (((a)=((a)+(b))%mo)<0?(a)+=mo:(a))
#define mmo(a,b) (((a)=1ll*(a)*(b)%mo)<0?(a)+=mo:(a))
void getre(){int x=0;printf("%d\n",1/x);}
void gettle(){int res=1;while(1)res<<=1;printf("%d\n",res);}
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vpii;
template<typename T,typename S>inline bool upmin(T&a,const S&b){return a>b?a=b,1:0;}
template<typename T,typename S>inline bool upmax(T&a,const S&b){return a<b?a=b,1:0;}
template<typename N,typename PN>inline N flo(N a,PN b){return a>=0?a/b:-((-a-1)/b)-1;}
template<typename N,typename PN>inline N cei(N a,PN b){return a>0?(a-1)/b+1:-(-a/b);}
template<typename N>N gcd(N a,N b){return b?gcd(b,a%b):a;}
template<typename N>inline int sgn(N a){return a>0?1:(a<0?-1:0);}
#if ( ( _WIN32 || __WIN32__ ) && __cplusplus < 201103L)
#define lld "%I64d"
#else
#define lld "%lld"
#endif
inline void gn(long long&x){
	int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-');c=='-'?(sg=-1,x=0):(x=c-'0');
	while((c=getchar())>='0'&&c<='9')x=x*10+c-'0';x*=sg;
}
inline void gn(int&x){long long t;gn(t);x=t;}
inline void gn(unsigned long long&x){long long t;gn(t);x=t;}
inline void gn(double&x){double t;scanf("%lf",&t);x=t;}
inline void gn(long double&x){double t;scanf("%lf",&t);x=t;}
inline void gs(char *s){scanf("%s",s);}
inline void gc(char &c){while((c=getchar())>126 || c<33);}
inline void pc(char c){putchar(c);}
#ifdef JCVB
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define debug(...)
#endif
typedef long long ll;
typedef double db;
inline ll sqr(ll a){return a*a;}
inline db sqrf(db a){return a*a;}
//const int inf=0x3f3f3f3f;
const ll inf=1e15;
const db pi=3.14159265358979323846264338327950288L;
const db eps=1e-6;
//const int mo=0;
//int qp(int a,ll b){int n=1;do{if(b&1)n=1ll*n*a%mo;a=1ll*a*a%mo;}while(b>>=1);return n;}


// manually set n = number of vertices 
// vertex index from 1 to n
// first call tree_init();
// ae(u,v) only one direction  (not adding u->pre[u] is ok)
// build_hld(rt)  preferred son moved to the beginning of linkedlist
// 	dfn[u] continuous integers down along a preferred chain (up[u] -> leaf)

const int TREE_MAXV=100000+5;
struct edge{int v,next;}e[TREE_MAXV*2];int g[TREE_MAXV],etot;
int n;
void ae(int u,int v){
	e[etot].v=v;
	e[etot].next=g[u];g[u]=etot++;
}
int dfn[TREE_MAXV],rig[TREE_MAXV],pre[TREE_MAXV],h[TREE_MAXV];
int seq[TREE_MAXV],up[TREE_MAXV];
void build_hld(int rt){
	static int qu[TREE_MAXV],sz[TREE_MAXV],son[TREE_MAXV];
	int p=0,q=0;
	qu[q++]=rt;
	pre[rt]=0;
	h[rt]=0;
	while(p!=q){
		int u=qu[p++];sz[u]=1,son[u]=0;
		for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u])
			qu[q++]=e[i].v,pre[e[i].v]=u,h[e[i].v]=h[u]+1;
	}
	sz[0]=0;
	for (int i=q-1;i>=1;i--){
		sz[pre[qu[i]]]+=sz[qu[i]];
		if(sz[qu[i]]>sz[son[pre[qu[i]]]])son[pre[qu[i]]]=qu[i];
	}
	for (int j=0;j<q;j++)
		if(!son[qu[j]]){
			int s=qu[j];while(son[pre[s]]==s)s=pre[s];
			int t=s;while(t)up[t]=s,t=son[t];
		}else{
			int u=qu[j],v=son[u];
			if(e[g[u]].v!=v){
				for (int i=g[u],j;~i;j=i,i=e[i].next)if(e[i].v==v){
					e[j].next=e[i].next;
					e[i].next=g[u];
					g[u]=i;
					break;
				}
			}
		}
	static int stk[TREE_MAXV],cur[TREE_MAXV];
	int top=0,ind=0;
	stk[++top]=rt;
	cur[top]=g[rt];
	while(top){
		int u=stk[top];
		if(cur[top]==g[u]){
			dfn[u]=++ind;
			seq[ind]=u;	
		}
		if(cur[top]==-1){
			rig[u]=ind;	
			top--;
		}else{
			int v=e[cur[top]].v;cur[top]=e[cur[top]].next;
			if(v==pre[u])continue;
			stk[++top]=v;
			cur[top]=g[v];
		}
	}

}	


// range update, range query
// index 1..n
// first call seginit(n)

typedef ll seg_nu;
typedef ll seg_tag;
const int SEG_MAXN=100000+5;

int seglen[SEG_MAXN*4];
seg_nu seg[SEG_MAXN*4];
seg_tag tag[SEG_MAXN*4];
seg_tag tag0 = 0;						//modify
inline void segadd(int x,seg_tag v){
	seg[x]=seg[x]+v;				//modify
	tag[x]=tag[x]+v;					//modify
}
inline void segpd(int x){
	if(tag[x]!=tag0){
		segadd(x<<1,tag[x]);
		segadd(x<<1|1,tag[x]);
		tag[x]=tag0;					
	}
}
inline void segpu(int x){
	seg[x]=min(seg[x<<1],seg[x<<1|1]);				//modify
}
void seginit_in(int l,int r,int x){
	tag[x]=tag0;						
	seglen[x]=r-l+1;
	if(l==r){
		//seg[x]=a[l];
		seg[x]=0;					//modify
	}else{
		int mid=l+r>>1;
		seginit_in(l,mid,x<<1);
		seginit_in(mid+1,r,x<<1|1);
		segpu(x);
	}
}
int l1,r1;
seg_nu sans; bool ans_bo;
seg_tag stag;
void segupd_in(int l,int r,int x){
	//if(l1>r1)return;
	if(l1<=l && r<=r1){
		segadd(x,stag);
	}else{
		int mid=l+r>>1;
		segpd(x);
		if(l1<=mid)segupd_in(l,mid,x<<1);
		if(r1>mid)segupd_in(mid+1,r,x<<1|1);
		segpu(x);
	}
}
/* void segque_in(int l,int r,int x){ */
	/* //if(l1>r1)return; */
	/* if(l1<=l && r<=r1){ */
	/* 	if(!ans_bo)ans_bo=1,sans=seg[x]; */
	/* 	else sans=sans+seg[x];				//modify */
	/* }else{ */
	/* 	int mid=l+r>>1; */
	/* 	segpd(x); */
	/* 	if(l1<=mid)segque_in(l,mid,x<<1); */
	/* 	if(r1>mid)segque_in(mid+1,r,x<<1|1); */
	/* } */
/* } */
int segn;
void segupd(int l,int r,seg_tag v){
	if(l>r)return;
	stag=v,l1=l,r1=r;
	segupd_in(1,segn,1);
}
/* seg_nu segque(int l,int r){ */
/* 	if(l>r)return 0;					//modify */
/* 	ans_bo=0,l1=l,r1=r; */
/* 	segque_in(1,segn,1); */
/* 	return sans; */
/* } */
void seginit(int n){
	segn=n;
	seginit_in(1,segn,1);
}

const int B = 1e6;
void addit(int a,int b,int id,int sg){
	int l1,r1;
	while(up[a]!=up[b]){
		if(h[up[a]]<h[up[b]])swap(a,b);
		l1=dfn[up[a]],r1=dfn[a];	
		segupd(l1,r1,(B+id)*sg);
		a=pre[up[a]];
	}
	if(h[a]>h[b])swap(a,b);

	// work on edges:
	l1=dfn[a]+1,r1=dfn[b];
	if(a!=b){
		segupd(l1,r1,(B+id)*sg);
	}

}

int getpos(int l,int r,int x){
	if(l==r)return l;
	else{
		int mid=l+r>>1;
		segpd(x);
		if(seg[x<<1]<seg[x<<1|1])return getpos(l,mid,x<<1);
		else return getpos(mid+1,r,x<<1|1);
	}
}

/* int lca(int a,int b){	// using hld, O(log n) */
/* 	while(up[a]!=up[b]){ */
/* 		if(h[up[a]]<h[up[b]])swap(a,b); */
/* 		a=pre[up[a]]; */
/* 	} */
/* 	if(h[a]>h[b])swap(a,b); */
/* 	return a; */
/* } */
void tree_init(){
	static bool ini=0;
	if(!ini){
		ini=1;
		memset(g,-1,sizeof(g));
	}else{
		for (int i=0;i<=n;i++)g[i]=-1;
	}
	etot=0;
}
void readedge(){
	for (int i=1;i<n;i++){
		int x,y;gn(x);gn(y);
		ae(x,y);ae(y,x);
	}
}

pii lin[111111];

int main()
{
#ifdef JCVB
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	int _time_jc=clock();
#endif
	tree_init();
	gn(n);
	readedge();
	rep(i,1,n){
		gn(lin[i].fi);gn(lin[i].se);
	}
	build_hld(1);
	seginit(n);
	rep(i,1,n){
		addit(lin[i].fi,lin[i].se,i,1);
	}
	rep(_,1,n){
		while(seg[1]==0){
			int t=getpos(1,n,1);
			segupd(t,t,inf);
		}
		ll t= seg[1];
		if(t>=2*B){
			printf("NO\n");
			return 0;
		}
		int id=t-B;
		addit(lin[id].fi,lin[id].se,id,-1);
	}
	printf("YES\n");

#ifdef JCVB
	debug("time: %d\n",int(clock()-_time_jc));
#endif
	return 0;
}


Submission Info

Submission Time
Task E - Blue and Red Tree
User jcvb
Language C++14 (GCC 5.4.1)
Score 1400
Code Size 8065 Byte
Status AC
Exec Time 364 ms
Memory 15104 KiB

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 3 ms 10496 KiB
in10.txt AC 312 ms 15104 KiB
in11.txt AC 185 ms 15104 KiB
in12.txt AC 179 ms 15104 KiB
in13.txt AC 181 ms 15104 KiB
in14.txt AC 183 ms 15104 KiB
in15.txt AC 179 ms 15104 KiB
in16.txt AC 179 ms 15104 KiB
in17.txt AC 181 ms 15104 KiB
in18.txt AC 179 ms 15104 KiB
in19.txt AC 179 ms 15104 KiB
in2.txt AC 3 ms 10496 KiB
in20.txt AC 183 ms 15104 KiB
in21.txt AC 185 ms 15104 KiB
in22.txt AC 182 ms 15104 KiB
in23.txt AC 184 ms 15104 KiB
in24.txt AC 188 ms 15104 KiB
in25.txt AC 183 ms 15104 KiB
in26.txt AC 181 ms 15104 KiB
in27.txt AC 186 ms 15104 KiB
in28.txt AC 185 ms 15104 KiB
in29.txt AC 186 ms 15104 KiB
in3.txt AC 3 ms 10496 KiB
in30.txt AC 187 ms 15104 KiB
in31.txt AC 364 ms 15104 KiB
in32.txt AC 359 ms 15104 KiB
in33.txt AC 358 ms 15104 KiB
in34.txt AC 359 ms 15104 KiB
in35.txt AC 359 ms 15104 KiB
in36.txt AC 361 ms 15104 KiB
in37.txt AC 361 ms 15104 KiB
in38.txt AC 149 ms 15104 KiB
in39.txt AC 132 ms 15104 KiB
in4.txt AC 316 ms 15104 KiB
in40.txt AC 142 ms 15104 KiB
in41.txt AC 350 ms 15104 KiB
in42.txt AC 333 ms 15104 KiB
in43.txt AC 351 ms 15104 KiB
in44.txt AC 342 ms 15104 KiB
in45.txt AC 334 ms 15104 KiB
in46.txt AC 87 ms 15104 KiB
in47.txt AC 92 ms 15104 KiB
in5.txt AC 315 ms 15104 KiB
in6.txt AC 98 ms 15104 KiB
in7.txt AC 314 ms 15104 KiB
in8.txt AC 309 ms 15104 KiB
in9.txt AC 315 ms 15104 KiB
sample1.txt AC 3 ms 10496 KiB
sample2.txt AC 3 ms 10496 KiB
sample3.txt AC 3 ms 10496 KiB