水果姐逛水果街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 }

Method_01

  Codevs 2244ms

时间: 2024-08-01 22:46:20

水果姐逛水果街II——又又一个LCA的相关文章

3304 水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

【树上倍增】【分类讨论】水果姐逛水果街Ⅱ

3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,

【树链剖分】【分类讨论】水果姐逛水果街Ⅲ

3306 水果姐逛水果街Ⅲ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 连续两天都没有被cgh难倒,水果姐心情很不错,第三天又来逛水果街. 今天cgh早早就来到了水果街等水果姐,因为他带来了帮手cys.cgh的魔法是把水果街变成树结构,而cys的魔法是瞬间改变某家店的水果价格.一边问一边改,绝不给水果姐思考的时间! 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh和cys

水果姐逛水果街Ⅱ codevs 3305

3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去.求最多可以赚多

codevs水果姐逛水果街3

3306 水果姐逛水果街Ⅲ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 连续两天都没有被cgh难倒,水果姐心情很不错,第三天又来逛水果街. 今天cgh早早就来到了水果街等水果姐,因为他带来了帮手cys.cgh的魔法是把水果街变成树结构,而cys的魔法是瞬间改变某家店的水果价格.一边问一边改,绝不给水果姐思考的时间! 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh和cys

CodeVs——T 3305 水果姐逛水果街Ⅱ

http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中

codevs3305 水果姐逛水果街Ⅱ

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样

codevs3304 水果姐逛水果街

题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去,求每个问题中最多可以赚多少钱. 输

水果姐逛水果街Ⅰ(codevs 3304)

题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去,求每个问题中最多可以赚多少钱. 输