Enumeration left interval segment tree maintain maximum value
#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <vector>#include <cmath>#include <queue>#include <set>#include <map>#define LL Long Long#define MOD 999911659 //2 3 4679 35617 #define N 5000051using namespace STD;intSC () {intI=0, f=1;CharC=getchar (); while(c>' 9 '|| c<' 0 '){if(c=='-') f=-1; C=getchar ();} while(c>=' 0 '&&c<=' 9 ') i=i*Ten+c-' 0 ', C=getchar ();returnI*f;}Long LongMx[n],tag[n],ans;intp[n/5],nxt[n/5],n,m,w[n/5],f[n/5];voidPush_down (intx) {if(Tag[x]) {intl=x<<1,r=x<<1|1; TAG[L]+=TAG[X]; TAG[R]+=TAG[X]; MX[L]+=TAG[X]; MX[R]+=TAG[X]; tag[x]=0; }}voidChangeintXintLintRintLintRintV) {if(L==L&&R==R) {mx[x]+=v; Tag[x]+=v;return; } push_down (x);intMid=l+r>>1;if(r<=mid) Change (x<<1, l,mid,l,r,v);Else if(l>mid) Change (x<<1|1, mid+1, r,l,r,v);ElseChange (x<<1, l,mid,l,mid,v), Change (x<<1|1, mid+1, r,mid+1, r,v); Mx[x]=max (mx[x<<1],mx[x<<1|1]);}intMain () {N=SC (); M=sc (); for(intI=1; i<=n;i++) F[I]=SC (); for(intI=1; i<=m;i++) W[I]=SC (); for(inti=n;i>=1; i--) nxt[i]=p[f[i]],p[f[i]]=i; for(intI=1; i<=m;i++) {if(!p[i])Continue;inty=nxt[p[i]]?nxt[p[i]]:n+1; Change1,1, n+1, p[i],y-1, W[i]); } for(intI=1; i<=n;i++) {Ans=max (ans,mx[1]);inty=nxt[i]?nxt[i]:n+1; Change1,1, n+1, i,y-1,-w[f[i]]);if(y!=n+1) {intt=nxt[y]?nxt[y]:n+1; Change1,1, n+1, y,t-1, W[f[i]]); } }cout<<ans;}
3747: [poi2015]kinoman| segment tree