练下线段树。。。明天加油(准确的说是后天吧。。。)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<iostream>
 6 #define inc(i,l,r) for(i=l;i<=r;i++)
 7 #define dec(i,l,r) for(i=l;i>=r;i--)
 8 #define inf 1e9
 9 #define mem(a) memset(a,0,sizeof(a))
10 #define ll long long
11 #define succ(x) (1<<x)
12 #define NM 600000+5
13 using namespace std;
14 int read(){
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
17     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
18     return x*f;
19 }
20 struct info{
21     int max,min,l,r;
22     info(int x=0):max(x),min(x),r(0),l(0){}
23 }T[NM],null;
24 int n,m,_x,_y;
25 info operator+(const info&x,const info&y){
26     info f;
27     f.min=min(x.min,y.min);
28     f.max=max(x.max,y.max);
29     f.l=max(x.l,y.l);f.r=max(x.r,y.r);
30     f.l=max(f.l,y.max-x.min);f.r=max(f.r,x.max-y.min);
31     return f;
32 }
33 void build(int i,int x,int y){
34     int t=x+y>>1;
35     if(x==y){
36         T[i]=info(read());
37         return;
38     }
39     build(i<<1,x,t);build(i<<1|1,t+1,y);
40     T[i]=T[i<<1]+T[i<<1|1];
41 }
42 info ask(int i,int x,int y){
43     int t=x+y>>1;
44     if(_x>y||_y<x)return null;
45     if(_x<=x&&y<=_y)return T[i];
46     return ask(i<<1,x,t)+ask(i<<1|1,t+1,y);
47 }
48 int main(){
49     n=read();
50     build(1,1,n);
51     null.l=null.r=null.max=-inf;null.min=inf;
52     m=read();
53     while(m--){
54         _x=read();_y=read();
55         if(_x<=_y)printf("%d\n",ask(1,1,n).l);
56         else{
57             swap(_x,_y);
58             printf("%d\n",ask(1,1,n).r);
59         }
60     }
61     return 0;
62 }
View Code

 

posted on 2015-11-05 21:10  onlyRP  阅读(125)  评论(0编辑  收藏  举报