码迷,mamicode.com
首页 > 其他好文 > 详细

jzoi#13t1

时间:2015-08-19 00:12:49      阅读:363      评论:0      收藏:0      [点我收藏+]

标签:

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 }
View Code

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。

jzoi#13t1

标签:

原文地址:http://www.cnblogs.com/chensiang/p/4741039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!