1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define PI acos(-1.0) #define eps 1e-8 #define Pair pair<double,double>
#define mod 998244353 #define MAXN 2e6 #define MS 500009
LL n,m; LL cl,cr; LL a[MS]; struct node{ LL pos,val; }p[MS<<2]; struct nod{ LL o,l,r,pos,val; }; priority_queue<nod > Q;
bool operator < (nod t1,nod t2){ return t1.val-a[t1.o-1] < t2.val-a[t2.o-1]; }
void push_up(int rt){ p[rt].val = max(p[ls].val,p[rs].val); if(p[ls].val >= p[rs].val) p[rt].pos = p[ls].pos; else p[rt].pos = p[rs].pos; }
void build(int l,int r,int rt){ if(l == r){ p[rt] = {l,a[l]}; return; } int m = l+r>>1; build(l,m,ls); build(m+1,r,rs); push_up(rt); }
node query(int L,int R,int l,int r,int rt){ if(L <= l && r <= R){ return p[rt]; } int m = l+r>>1; if(m < L) return query(L,R,m+1,r,rs); else if(m >= R) return query(L,R,l,m,ls); else{ node ans; node t1 = query(L,R,l,m,ls); node t2 = query(L,R,m+1,r,rs); ans.val = max(t1.val,t2.val); if(t1.val >= t2.val) ans.pos = t1.pos; else ans.pos = t2.pos; return ans; } }
int main() { ios::sync_with_stdio(false); cin >> n >> m >> cl >> cr; for(int i=1;i<=n;i++){ cin >> a[i]; a[i] += a[i-1]; } build(1,n,1); for(int i=1;i+cl-1<=n;i++){ LL tl = i+cl-1; LL tr = min(i+cr-1,n); node t = query(tl,tr,1,n,1); Q.push({i,tl,tr,t.pos,t.val}); } LL ans = 0; while(m--){ nod cc = Q.top(); Q.pop(); ans += cc.val - a[cc.o-1]; if(cc.l <= cc.pos-1){ node ql = query(cc.l,cc.pos-1,1,n,1); Q.push({cc.o,cc.l,cc.pos-1,ql.pos,ql.val}); } if(cc.pos+1 <= cc.r){ node qr = query(cc.pos+1,cc.r,1,n,1); Q.push({cc.o,cc.pos+1,cc.r,qr.pos,qr.val}); } } cout << ans << "\n";
return 0; }
|