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 }