首页 > 代码库 > 水果姐逛水果街II——又又一个LCA
水果姐逛水果街II——又又一个LCA
做得很累,最后都是临摹一份代码过的,但是总归是对了,但是效率出奇的差。
1 #include<iostream> 2 #include<vector> 3 #include<cstdio> 4 #define F ast[x][i-1] 5 using namespace std; 6 const int N=200010; 7 //Constants;// 8 int n,m,val[N]; 9 vector<int> gr[N];10 //INput;//11 int ans,ast[N][18],depth[N],mxv[N][18],mnv[N][18],up[N][18],dn[N][18];12 bool vis[N];13 //Usage;//14 15 void dfs(int x){16 vis[x]=true;17 for(int i=1;i<=18;i++){18 if(depth[x]<(1<<i))break;19 ast[x][i]=ast[F][i-1];20 21 mxv[x][i]=max(mxv[x][i-1],mxv[F][i-1]);22 mnv[x][i]=min(mnv[x][i-1],mnv[F][i-1]);23 24 up[x][i]=max(max(up[x][i-1],up[F][i-1]),mxv[F][i-1]-mnv[x][i-1]);25 dn[x][i]=max(max(dn[x][i-1],dn[F][i-1]),mxv[x][i-1]-mnv[F][i-1]);26 }27 28 for(int i=0;i<gr[x].size();i++)29 if(!vis[gr[x][i]]){30 int v=gr[x][i];31 ast[v][0]=x;32 depth[v]=depth[x]+1;33 34 mxv[v][0]=max(val[v],val[x]);35 mnv[v][0]=min(val[v],val[x]);36 37 up[v][0]=val[x]-val[v];38 dn[v][0]=val[v]-val[x];39 40 dfs(v);41 }42 }43 44 int lca(int x,int y){45 if(depth[x]<depth[y])swap(x,y);46 int k=depth[x]-depth[y];47 for(int i=0;i<=18;i++)48 if(k&(1<<i))49 x=ast[x][i];50 51 for(int i=18;i>=0;i--)52 if(ast[x][i]!=ast[y][i])53 x=ast[x][i],y=ast[y][i];54 55 if(x==y)return x;56 return ast[x][0];57 }58 59 int calculate(int x,int y){60 int maxn=0,minn=0x7fffffff,pnt=lca(x,y),k;61 ans=0;62 k=depth[x]-depth[pnt];63 if(k>0){64 for(int i=0;i<=18;i++)65 if(k&(1<<i)){66 ans=max(ans,max(mxv[x][i]-minn,up[x][i]));67 minn=min(minn,mnv[x][i]);68 x=ast[x][i];69 }70 }71 k=depth[y]-depth[pnt];72 if(k>0){73 for(int i=0;i<=18;i++)74 if(k&(1<<i)){75 ans=max(ans,max(maxn-mnv[y][i],dn[y][i]));76 maxn=max(maxn,mxv[y][i]);77 y=ast[y][i];78 }79 }80 ans=max(ans,maxn-minn);81 }82 //Function(s);//83 int main(){84 cin>>n;85 for(int i=1;i<=n;i++)cin>>val[i];86 for(int i=1;i<n;i++){87 int x,y;cin>>x>>y;88 gr[x].push_back(y);gr[y].push_back(x);89 }90 ast[1][0]=1;91 dfs(1);92 cin>>m;93 while(m--){94 int x,y;cin>>x>>y;95 calculate(x,y);96 cout<<ans<<endl;97 }98 return 0;99 }
Codevs 2244ms
水果姐逛水果街II——又又一个LCA
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。