乱搞题

来源:互联网 发布:冰原狙击淘宝上有卖吗 编辑:程序博客网 时间:2024/05/21 10:48

一开始题读错了。。MDZZ。。

然而,用我理解的较为复杂的题意还是A了此题。。

2333

当然原题就是智障LCA


code:

#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;#define maxn 40010void read(int& x){char c = getchar();x = 0;bool flag = false;while(c<'0'||c>'9')c=='-'?flag=true:1,c=getchar();while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}flag?x=-x:1;}/////////////////////////////////////int n,m,a,b,root;//,size;//vector<int> e[maxn];//int dis[maxn],kind[maxn];struct edge{int to,next;}e[maxn];int head[maxn];bool del[maxn];int eid,link[maxn],dis[maxn];inline void adde(int u,int v){e[eid].to = v;e[eid].next=head[u];head[u]=eid++;}void btree(int u){for(int i=head[u];~i;i=e[i].next){if(del[i])continue;int v = e[i].to;if(!~link[v]){link[v] = i;dis[v] = dis[u]+1;btree(v);}else{if(dis[v]<dis[u]+1){del[link[v]]=true;link[v]=i;dis[v] = dis[u]+1;btree(v);}else del[i]=true;}}}//////////////////////////////////////*void dfs(int u,int d,int k){if(dis[u]>d)return;kind[u] = k;dis[u] = d;int sz = e[u].size();if(sz==1)dfs(e[u][0],d+1,u);for(int i=0;i<sz;i++)dfs(e[u][i],d+1);}*/int f[maxn][25];//,d[maxn];void dfs(int u,int fa){f[u][0]=fa;//d[u] = d[fa]+1;for(int i=1;i<=20;i++)f[u][i]=f[f[u][i-1]][i-1];for(int i=head[u];~i;i=e[i].next){if(del[i])continue;//d[e[i].to]=d[u]+1;dfs(e[i].to,u);}}int LCA(int x,int y){if(dis[x]>dis[y])swap(x,y);int i;for(int i=20;i>=0;i--){if(dis[f[y][i]]>=dis[x])y = f[y][i];}for(int i=20;i>=0;i--){if(f[x][i]==f[y][i])continue;x = f[x][i];y = f[y][i];}if(x==y)return x;else return f[y][0];}int main(void){#define ACK#ifdef ACKfreopen("tree.in","r",stdin);freopen("tree.out","w",stdout);#endifmemset(head,-1,sizeof(head));memset(link,-1,sizeof(link));read(n);for(int i=1;i<=n;i++){read(a),read(b);if(b==-1)root=a;else adde(b,a);//e[b].push_back(a);}dis[root]=1;btree(root);//size = e[root].size();/*for(int i=0;i<size;i++){k = e[root][i];kind[k]=k;dfs(k,1,k);}*/dfs(root,0);read(m);for(int i=1;i<=m;i++){read(a),read(b);if(a==root)puts("1");else if(b==root)puts("2");else if(a==b)puts("0");/*else{if(kind[a]!=kind[b])puts("0");else{if(dis[a]>dis[b])puts("2");else if(dis[a]<dis[b])puts("1");else puts("0");}}*/else{int p = LCA(a,b);if(p==a)puts("1");else if(p==b)puts("2");else puts("0");}}return 0;}


1 0
原创粉丝点击