首页 > 其他 > 详细

水果姐逛水果街II——又又一个LCA

时间:2017-07-03 23:14:18      阅读:327      评论:0      收藏:0      [点我收藏+]

  做得很累,最后都是临摹一份代码过的,但是总归是对了,但是效率出奇的差。

技术分享
 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 }
Method_01

  Codevs 2244ms

水果姐逛水果街II——又又一个LCA

原文:http://www.cnblogs.com/duskfire/p/7113393.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!