标签:
dfs序真厉害(cena没有o2,vector会炸)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<ctime> 8 #include<vector> 9 #define intree(u,v) (id[u]<=R[v]&&id[u]>=L[v]) 10 #define Rep(i,k) for(int i=first[k];i;i=next[i]) 11 #define lowbit(a) ((a)&(-(a))) 12 #define clr(a,x) memset(a,x,sizeof(a)) 13 #define rep(i,l,r) for(int i=l;i<(r);i++) 14 typedef long long ll; 15 using namespace std; 16 int read() 17 { 18 char c=getchar(); 19 int ans=0,f=1; 20 while(!isdigit(c)){ 21 if(c==‘-‘) f=-1; 22 c=getchar(); 23 } 24 while(isdigit(c)){ 25 ans=ans*10+c-‘0‘; 26 c=getchar(); 27 } 28 return ans*f; 29 } 30 struct edge{ 31 int u,v; 32 }; 33 const int maxn=2000009; 34 int n,m,dfstime=0,cnt=0,next[maxn],c[maxn],first[maxn],id[maxn],L[maxn],R[maxn],dep[maxn]; 35 edge E[maxn]; 36 int e[maxn<<1]; 37 void dfs(int k,int f){ 38 L[k]=id[k]=++dfstime; 39 Rep(i,k){ 40 if(e[i]!=f){ 41 dep[e[i]]=dep[k]+1; 42 dfs(e[i],k); 43 } 44 } 45 R[k]=dfstime; 46 } 47 int main() 48 { 49 freopen("tree.in","r",stdin); 50 freopen("tree.out","w",stdout); 51 n=read(); 52 rep(i,1,n){ 53 int from=read(),to=read(); 54 e[++cnt]=to; 55 if(!first[from]) first[from]=cnt; 56 next[c[from]]=cnt; 57 c[from]=cnt; 58 e[++cnt]=from; 59 if(!first[to]) first[to]=cnt; 60 next[c[to]]=cnt; 61 c[to]=cnt; 62 E[i].u=from;E[i].v=to; 63 } 64 dfs(1,0); 65 m=read(); 66 while(m--){ 67 int from=read(),to=read(),t=read(); 68 int u=E[t].u,v=E[t].v; 69 if(dep[u]>dep[v]) swap(u,v); 70 if((intree(from,v)&&!intree(to,v))||(!intree(from,v)&&intree(to,v))) 71 puts("NO"); 72 else puts("YES"); 73 } 74 fclose(stdin); 75 fclose(stdout); 76 return 0; 77 }
Tree
【问题描述】
这天,CD 作为 moreD 的宠物,又被残酷地训练爬树了,moreD 保证了这
棵树满足从任意一个点出发,CD 都能走到所有的点,CD 每天都要爬过所有的
点才能回家吃饭。经过一天又一天残酷的训练以后,CD 已经忍无可忍了,于是
CD 会愤怒地误伤一条树枝,一条树枝被误伤以后就不可以再走了。
当然,CD不符合宠物法则的行动怎么会逃过moreD的眼睛,moreD决定,
每当 CD 误伤一条树枝,他都会再重新加一条树枝,可是他不知道加完以后,这
只宠物是否还能从任意一个点出发到达所有的点,要是不能,岂不是让这只宠物
得逞了么?
问题是,现在moreD也不知道CD最终会误伤哪一条树枝,于是现在moreD
臆测出了许多种可能,你要告诉 moreD:如果 CD 误伤了第 z 条边,他再在编
号为 x 的点和编号为 y 的点之间加一条边,CD 是否能得逞。
【输入格式】
第一行一个正整数 n,表示节点个数。
接下来 n-1 行,每行两个正整数 x,y,表示原来树上存在一条连接编号为
x 的节点和编号为 y 的节点的边。
第 n+1 行一个正整数 Q,表示询问次数。
接下来 Q 行,每行三个正整数 x,y,z,表示一个询问(含义如题所示)。
【输出格式】
输出共 Q 行。
对于每一个询问,如果 CD 会得逞就输出 YES,否则输出 NO。
【样例输入输出】
tree.in tree.out
5
1 2
2 3
2 4
NO
YES
YES 中山纪念中学 NOIP2012 Fortuna 系列模拟赛 by lulu/moreD
4 5
3
2 5 3
2 3 1
1 5 2
【数据说明】
对于 20%的数据保证 n,Q≤1000。
对于另外 20%的数据保证 n,Q≤10000 且树为随机生成。
对于 70%的数据保证 n,Q≤200000。
对于 100%的数据保证 n≤200000,Q≤2000000。
标签:
原文地址:http://www.cnblogs.com/chensiang/p/4741039.html