Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
来源:互联网 发布:中国网络经纪人客户端 编辑:程序博客网 时间:2024/05/18 10:52
C. Drazil and Park
题目连接:
http://codeforces.com/contest/516/problem/C
Description
Drazil is a monkey. He lives in a circular park. There are n trees around the park. The distance between the i-th tree and (i + 1)-st trees is di, the distance between the n-th tree and the first tree is dn. The height of the i-th tree is hi.
Drazil starts each day with the morning run. The morning run consists of the following steps:
Drazil chooses two different trees
He starts with climbing up the first tree
Then he climbs down the first tree, runs around the park (in one of two possible directions) to the second tree, and climbs on it
Then he finally climbs down the second tree.
But there are always children playing around some consecutive trees. Drazil can't stand children, so he can't choose the trees close to children. He even can't stay close to those trees.
If the two trees Drazil chooses are x-th and y-th, we can estimate the energy the morning run takes to him as 2(hx + hy) + dist(x, y). Since there are children on exactly one of two arcs connecting x and y, the distance dist(x, y) between trees x and y is uniquely defined.
Now, you know that on the i-th day children play between ai-th tree and bi-th tree. More formally, if ai ≤ bi, children play around the trees with indices from range [ai, bi], otherwise they play around the trees with indices from .
Please help Drazil to determine which two trees he should choose in order to consume the most energy (since he wants to become fit and cool-looking monkey) and report the resulting amount of energy for each day.
Input
The first line contains two integer n and m (3 ≤ n ≤ 105, 1 ≤ m ≤ 105), denoting number of trees and number of days, respectively.
The second line contains n integers d1, d2, ..., dn (1 ≤ di ≤ 109), the distances between consecutive trees.
The third line contains n integers h1, h2, ..., hn (1 ≤ hi ≤ 109), the heights of trees.
Each of following m lines contains two integers ai and bi (1 ≤ ai, bi ≤ n) describing each new day. There are always at least two different trees Drazil can choose that are not affected by children.
Output
For each day print the answer in a separate line.
Sample Input
5 3
2 2 2 2 2
3 5 2 1 4
1 3
2 2
4 5
Sample Output
12
16
18
Hint
题意
m个询问,问你区间[L,R]中h[a]2+h[b]2+dis(a,b)的最大值是多少。
要求a>b
题解
把dis(a,b)拆开成pred[a]-pred[b]
然后我令A = h[a]+pred[a],B = h[b]-pred[b]
那么询问就是问区间A+B的最大值,但是A得大于B。
所以线段树合并的时候注意一下就好了。
#include<bits/stdc++.h>using namespace std;const int maxn = 2e5+7;const long long inf = 1LL*1e17;long long h[maxn],d[maxn];int n,q,a,b;struct node{ int l,r; long long A,B,AB;}tree[maxn*4];void build(int x,int l,int r){ tree[x].l=l,tree[x].r=r; if(l==r){ tree[x].A=h[l]+d[l-1]; tree[x].B=h[l]-d[l-1]; tree[x].AB=-inf; }else{ int mid=(l+r)/2; build(x<<1,l,mid); build(x<<1|1,mid+1,r); tree[x].A=max(tree[x<<1].A,tree[x<<1|1].A); tree[x].B=max(tree[x<<1].B,tree[x<<1|1].B); tree[x].AB=max(tree[x<<1].AB,max(tree[x<<1|1].AB,tree[x<<1].B+tree[x<<1|1].A)); }}node query(int x,int l,int r){ int L=tree[x].l,R=tree[x].r; if(l<=L&&R<=r){ return tree[x]; } int mid=(L+R)/2; node tmp1,tmp2,tmp3; tmp1.A=tmp1.B=tmp1.AB=tmp2.A=tmp2.B=tmp2.AB=tmp3.A=tmp3.B=tmp3.AB=-inf; if(l<=mid)tmp1=query(x<<1,l,r); if(r>mid)tmp2=query(x<<1|1,l,r); tmp3.A=max(tmp1.A,tmp2.A); tmp3.B=max(tmp1.B,tmp2.B); tmp3.AB=max(tmp1.AB,max(tmp2.AB,tmp1.B+tmp2.A)); return tmp3;}int main(){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)scanf("%lld",&d[i]),d[n+i]=d[i]; for(int i=1;i<=n;i++)scanf("%lld",&h[i]),h[i]*=2,h[n+i]=h[i]; for(int i=1;i<=2*n;i++)d[i]+=d[i-1]; build(1,1,2*n); for(int i=1;i<=q;i++){ scanf("%d%d",&a,&b); if(a<=b) printf("%lld\n",query(1,b+1,a+n-1).AB); else printf("%lld\n",query(1,b+1,a-1).AB); }}
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树维护
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
- Codeforces Round #292 (Div. 1) C. Drazil and Park
- Codeforces Round #292 (Div. 2)E. Drazil and Park——线段树
- Codeforces Round #292 (Div. 2) -- C. Drazil and Factorial
- Codeforces Round #292 (Div. 2) C. Drazil and Factoria
- Codeforces Round #292 (Div. 2) Problem C - Drazil and Factorial
- Codeforces Round #292 (Div. 1)---A. Drazil and Factorial
- Codeforces Round #292 (Div. 2) -- A. Drazil and Date
- Codeforces Round #292 (Div. 2)D. Drazil and Tiles
- Codeforces Round #292 (Div. 2) -- A. Drazil and Date
- Codeforces Round #321 (Div. 2)C. Kefa and Park
- Codeforces Round #321 (Div. 2) 580C - Kefa and Park
- Codeforces Round #321 (Div. 2)C. Kefa and Park
- Codeforces Round #321 (Div. 2) C. Kefa and Park dfs
- codeforces 515e Drazil and Park 线段树、区间最大子段和
- Codeforces Round #291 (Div. 1)B. Drazil and Tiles
- Codeforces Round #292 (Div. 2) C. Drazil and Factorial(贪心YY)
- 设计模式之中介者模式
- 语音播放与录音 (五分钟学会用 非常全面)
- 机器学习之逻辑回归
- javascript 排序(Sorting)算法与说明
- 设计模式学习(C++实现)4——建造者模式
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
- git 的安装 汉化
- table隔行变色
- u3d支付宝
- Android中两个手机间的Socket通信
- Ububtu16 设置mysql自动启动
- C++标准模板库学习(一)--vector的初步使用
- Redis的Replication
- SSM框架整合( Spring 、 SpringMVC 和 Mybatis )