【线段树】bzoj3747 [POI2015]Kinoman
2014-12-05 13:26
357 查看
题解:http://www.cnblogs.com/zyfzyf/p/4105184.html
一、下传标记写法
二、不下传标记写法
一、下传标记写法
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define lson rt<<1,l,m #define rson rt<<1|1,m+1,r int Num,CH[12],f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; for(x=0;c>='0'&&c<='9';c=getchar())(x*=10)+=(c-'0'); x*=f; } typedef long long ll; int n,m,w[1000001],now[1000001],b[1000001],fa[1000001]; ll ans,maxv[4000001],delta[4000001]; void pushdown(int rt) { if(delta[rt]) { delta[rt<<1]+=delta[rt]; delta[rt<<1|1]+=delta[rt]; maxv[rt<<1]+=delta[rt]; maxv[rt<<1|1]+=delta[rt]; delta[rt]=0; } } void update(int ql,int qr,int v,int rt,int l,int r) { if(ql<=l&&r<=qr) { delta[rt]+=(ll)v; maxv[rt]+=(ll)v; return; } pushdown(rt); int m=l+r>>1; if(ql<=m) update(ql,qr,v,lson); if(m<qr) update(ql,qr,v,rson); maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]); } ll query(int qr,int rt,int l,int r) { if(1<=l&&r<=qr) return maxv[rt]; pushdown(rt); int m=l+r>>1; ll res=0; if(1<=m) res=max(res,query(qr,lson)); if(m<qr) res=max(res,query(qr,rson)); return res; } int main() { R(n); R(m); for(int i=1;i<=n;++i) R(b[i]); for(int i=1;i<=m;++i) R(w[i]); for(int i=1;i<=n;++i) { fa[i]=now[b[i]]; now[b[i]]=i; } for(int i=1;i<=n;++i) { update(fa[i]+1,i,(ll)w[b[i]],1,1,n); if(fa[i]) update(fa[fa[i]]+1,fa[i],(ll)(-w[b[i]]),1,1,n); ans=max(ans,query(i,1,1,n)); } printf("%lld\n",ans); return 0; }
二、不下传标记写法
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define lson rt<<1,l,m #define rson rt<<1|1,m+1,r int Num,CH[12],f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; for(x=0;c>='0'&&c<='9';c=getchar())(x*=10)+=(c-'0'); x*=f; } typedef long long ll; int n,m,w[1000001],now[1000001],b[1000001],fa[1000001]; ll ans,maxv[4000001],delta[4000001]; void update(int ql,int qr,int v,int rt,int l,int r) { if(ql<=l&&r<=qr) { delta[rt]+=(ll)v; return; } int m=l+r>>1; if(ql<=m) update(ql,qr,v,lson); if(m<qr) update(ql,qr,v,rson); maxv[rt]=max(maxv[rt<<1]+delta[rt<<1],maxv[rt<<1|1]+delta[rt<<1|1]); } ll query(int qr,int rt,int l,int r) { if(1<=l&&r<=qr) return maxv[rt]+delta[rt]; int m=l+r>>1; ll res=0; if(1<=m) res=max(res,query(qr,lson)); if(m<qr) res=max(res,query(qr,rson)); return res; } int main() { R(n); R(m); for(int i=1;i<=n;++i) R(b[i]); for(int i=1;i<=m;++i) R(w[i]); for(int i=1;i<=n;++i) { fa[i]=now[b[i]]; now[b[i]]=i; } for(int i=1;i<=n;++i) { update(fa[i]+1,i,(ll)w[b[i]],1,1,n); if(fa[i]) update(fa[fa[i]]+1,fa[i],(ll)(-w[b[i]]),1,1,n); ans=max(ans,query(i,1,1,n)); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 【bzoj 3747】[POI2015]Kinoman(线段树)
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
- bzoj 3747: [POI2015]Kinoman 线段树
- 【BZOJ3747】[POI2015]Kinoman【线段树】
- BZOJ_3747_[POI2015]Kinoman_线段树
- [BZOJ]3747: [POI2015]Kinoman 线段树
- BZOJ 3747: [POI2015]Kinoman 【线段树】
- BZOJ 3747: [POI2015]Kinoman( 线段树 )
- bzoj 3747 [POI2015]Kinoman 线段树
- Bzoj 3747: [POI2015]Kinoman 线段树
- [BZOJ 3747] [POI 2015] Kinoman【线段树】
- [BZOJ3747][POI2015]Kinoman(线段树)
- 【bzoj3747】【POI2015】【Kinoman】【线段树】
- BZOJ3747 [POI2015]Kinoman 【线段树】
- bzoj 3747: [POI2015]Kinoman(线段树)
- 【bzoj3747】[POI2015]Kinoman 线段树区间合并
- [bzoj3747][POI2015]Kinoman_线段树
- [bzoj3747][POI2015]Kinoman 线段树
- BZOJ 3747 POI2015 Kinoman 线段树
- BZOJ 3747 POI 2015 Kinoman 线段树