记录编号 | 252544 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | 树上的游戏 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 6.522 s | ||
提交时间 | 2016-04-20 16:36:06 | 内存使用 | 33.93 MiB | ||
#include<cstdio> #include<iostream> #include<vector> #include<cmath> using namespace std; const int SIZEN=200010; int N; pair<int,int> P[SIZEN]; vector<int> s[SIZEN]; void read() { scanf("%d",&N); int fr,to; for(int i=1;i<N;i++) { scanf("%d%d",&fr,&to); P[i]=make_pair(fr,to); s[fr].push_back(to); s[to].push_back(fr); } } int dep[SIZEN],dfn[SIZEN*2],dfslist=0,first[SIZEN]; int ST[SIZEN*2][20]; void dfs(int x,int fa) { dfn[++dfslist]=x; first[x]=dfslist; for(int i=0;i<s[x].size();i++) { int v=s[x][i]; if(v==fa) continue; dep[v]=dep[x]+1; dfs(v,x); dfn[++dfslist]=x; } } void make_ST() { int t=int(log2(dfslist+0.0)); for(int i=1;i<=dfslist;i++) ST[i][0]=dfn[i]; for(int i=1;i<=t;i++) { for(int j=1;j<=dfslist;j++) { if(j+(1<<i)-1>dfslist) break; if(dep[ST[j][i-1]]<dep[ST[j+(1<<(i-1))][i-1]]) ST[j][i]=ST[j][i-1]; else ST[j][i]=ST[j+(1<<(i-1))][i-1]; } } } void prepare() { dep[1]=0; dfs(1,0); make_ST(); } int LCA(int x,int y) { int l=first[x],r=first[y]; if(l>r) swap(l,r); int m=int(log2(r-l+1.0)); int a=ST[l][m],b=ST[r-(1<<m)+1][m]; if(dep[a]<dep[b]) return a; return b; } int dist(int x,int y) { int A=LCA(x,y); return dep[x]+dep[y]-2*dep[A]; } void work() { prepare(); int Q; scanf("%d",&Q); int x,y,z; for(int i=1;i<=Q;i++) { scanf("%d%d%d",&x,&y,&z); int fr=P[z].first,to=P[z].second; if(dep[fr]>dep[to]) swap(fr,to); if(dep[x]>dep[y]) swap(x,y); //cout<<x<<" "<<y<<" "<<fr<<" "<<to<<endl; int t=LCA(x,y); if(LCA(x,fr)==fr&&LCA(x,to)==to&&LCA(t,fr)==t&&LCA(t,to)==t) printf("NO\n"); else if(LCA(y,fr)==fr&&LCA(y,to)==to&&LCA(t,fr)==t&&LCA(t,to)==t) printf("NO\n"); else printf("YES\n"); } } int main() { freopen("treegame.in","r",stdin); freopen("treegame.out","w",stdout); read(); work(); return 0; }