您的位置:首页 > 其它

【线段树】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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: