cogs 775. 山海经

solution

维护十个域:

lval  rval  val(中间最大)  sum(区间总值)

l1 r1  l2 r2 l3 r3

pushup真是醉了

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 using namespace std;
  5 const int N=100006;
  6 const int INF=0x7fffffff/3;
  7 int maxn(int a,int b){return a>b?a:b;}
  8 
  9 int n,m;
 10 int v[N];
 11 
 12 struct son
 13 {
 14     int lval,rval,val,sum;
 15     int l1,l2,l3,r1,r2,r3;
 16 };
 17 son a[N*5];
 18 
 19 void pushup(int x)
 20 {
 21     int lson=x<<1,rson=x<<1|1;
 22     if(a[lson].lval>=a[lson].sum+a[rson].lval)
 23     {
 24         a[x].lval=a[lson].lval;
 25         a[x].l1=a[lson].l1;
 26         a[x].r1=a[lson].r1;
 27     }
 28     else
 29     {
 30         a[x].lval=a[lson].sum+a[rson].lval;
 31         a[x].l1=a[lson].l1;
 32         a[x].r1=a[rson].r1;
 33     }
 34     
 35     if(a[rson].sum+a[lson].rval>=a[rson].rval)
 36     {
 37         a[x].rval=a[rson].sum+a[lson].rval;
 38         a[x].l2=a[lson].l2;
 39         a[x].r2=a[rson].r2;
 40     }
 41     else
 42     {
 43         a[x].rval=a[rson].rval;
 44         a[x].l2=a[rson].l2;
 45         a[x].r2=a[rson].r2;
 46     }
 47     
 48     int temp=a[lson].rval+a[rson].lval;
 49     int maxl=maxn(maxn(a[lson].val,a[rson].val),temp);
 50     a[x].val=maxl;
 51     if(maxl==a[lson].val)
 52     {
 53         a[x].l3=a[lson].l3;
 54         a[x].r3=a[lson].r3;
 55     }
 56     else
 57       if(maxl==temp)
 58       {
 59             a[x].l3=a[lson].l2;
 60             a[x].r3=a[rson].r1;
 61         }
 62     else
 63     {
 64         a[x].l3=a[rson].l3;
 65         a[x].r3=a[rson].r3;
 66     }
 67     
 68     a[x].sum=a[lson].sum+a[rson].sum;
 69 }
 70 
 71 void build(int l,int r,int x)
 72 {
 73     if(l==r)
 74     {
 75         a[x].lval=a[x].rval=a[x].val=a[x].sum=v[l];
 76         a[x].l1=a[x].l2=a[x].l3=a[x].r1=a[x].r2=a[x].r3=l;
 77         return ;
 78     }
 79     int mid=(l+r)>>1;
 80     build(l,mid,x<<1);
 81     build(mid+1,r,x<<1|1);
 82     pushup(x);
 83 }
 84 
 85 son qq(int L,int R,int l,int r,int x)
 86 {
 87     if(L<=l&&r<=R)
 88       return a[x];
 89     int mid=(l+r)>>1;
 90     son ans,lson,rson;
 91     if(L<=mid)
 92       lson=qq(L,R,l,mid,x<<1);
 93     if(mid<R)
 94       rson=qq(L,R,mid+1,r,x<<1|1);
 95     
 96     if(L<=mid&&mid<R)
 97     {
 98         if(lson.lval>=lson.sum+rson.lval)
 99         {
100             ans.lval=lson.lval;
101             ans.l1=lson.l1;
102             ans.r1=lson.r1;
103         }
104         else
105         {
106             ans.lval=lson.sum+rson.lval;
107             ans.l1=lson.l1;
108             ans.r1=rson.r1;
109         }
110         
111         if(rson.sum+lson.rval>=rson.rval)
112         {
113             ans.rval=rson.sum+lson.rval;
114             ans.l2=lson.l2;
115             ans.r2=rson.r2;
116         }
117         else
118         {
119             ans.rval=rson.rval;
120             ans.l2=rson.l2;
121             ans.r2=rson.r2;
122         }
123         
124         int temp=lson.rval+rson.lval;
125         int maxl=maxn(maxn(lson.val,rson.val),temp);
126         ans.val=maxl;
127         if(maxl==lson.val)
128         {
129             ans.l3=lson.l3;
130             ans.r3=lson.r3;
131         }
132         else
133           if(maxl==temp)
134           {
135                 ans.l3=lson.l2;
136                 ans.r3=rson.r1;
137             }
138         else
139         {
140             ans.l3=rson.l3;
141             ans.r3=rson.r3;
142         }
143         
144         ans.sum=lson.sum+rson.sum;
145     }
146     else
147       if(L<=mid)
148         ans=lson;
149     else
150       ans=rson;
151     return ans;
152 }
153 
154 int main(){
155     freopen("hill.in","r",stdin);
156     freopen("hill.out","w",stdout);
157     scanf("%d%d",&n,&m);
158     for(int i=1;i<=n;++i)
159       scanf("%d",&v[i]);
160     
161     build(1,n,1);
162     
163     while(m--)
164     {
165         int aa,bb;
166         scanf("%d%d",&aa,&bb);
167         son temp=qq(aa,bb,1,n,1);
168         int maxl=maxn(maxn(temp.lval,temp.rval),temp.val);
169         if(maxl==temp.lval)
170             printf("%d %d %d\n",temp.l1,temp.r1,maxl);
171         else
172           if(maxl==temp.val)
173             printf("%d %d %d\n",temp.l3,temp.r3,maxl);
174         else
175           printf("%d %d %d\n",temp.l2,temp.r2,maxl);
176     }
177     //while(1);
178     return 0;
179 }
code

 

posted @ 2017-08-05 09:39  A_LEAF  阅读(221)  评论(0编辑  收藏  举报