题解: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[],f,c;
inline void R(int &x){
c=;f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
typedef long long ll;
int n,m,w[],now[],b[],fa[];
ll ans,maxv[],delta[];
void pushdown(int rt)
{
if(delta[rt])
{
delta[rt<<]+=delta[rt]; delta[rt<<|]+=delta[rt];
maxv[rt<<]+=delta[rt]; maxv[rt<<|]+=delta[rt];
delta[rt]=;
}
}
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>>;
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
maxv[rt]=max(maxv[rt<<],maxv[rt<<|]);
}
ll query(int qr,int rt,int l,int r)
{
if(<=l&&r<=qr) return maxv[rt];
pushdown(rt);
int m=l+r>>; ll res=;
if(<=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=;i<=n;++i) R(b[i]);
for(int i=;i<=m;++i) R(w[i]);
for(int i=;i<=n;++i)
{
fa[i]=now[b[i]];
now[b[i]]=i;
}
for(int i=;i<=n;++i)
{
update(fa[i]+,i,(ll)w[b[i]],,,n);
if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
ans=max(ans,query(i,,,n));
} printf("%lld\n",ans);
return ;
}

二、不下传标记写法

 #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[],f,c;
inline void R(int &x){
c=;f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(x=;c>=''&&c<='';c=getchar())(x*=)+=(c-'');
x*=f;
}
typedef long long ll;
int n,m,w[],now[],b[],fa[];
ll ans,maxv[],delta[];
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>>;
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
maxv[rt]=max(maxv[rt<<]+delta[rt<<],maxv[rt<<|]+delta[rt<<|]);
}
ll query(int qr,int rt,int l,int r)
{
if(<=l&&r<=qr) return maxv[rt]+delta[rt];
int m=l+r>>; ll res=;
if(<=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=;i<=n;++i) R(b[i]);
for(int i=;i<=m;++i) R(w[i]);
for(int i=;i<=n;++i)
{
fa[i]=now[b[i]];
now[b[i]]=i;
}
for(int i=;i<=n;++i)
{
update(fa[i]+,i,(ll)w[b[i]],,,n);
if(fa[i]) update(fa[fa[i]]+,fa[i],(ll)(-w[b[i]]),,,n);
ans=max(ans,query(i,,,n));
} printf("%lld\n",ans);
return ;
}

最新文章

  1. font-weight -- 定义字体的粗细
  2. webService 基础
  3. Android笔记——Android框架
  4. PHP API接口测试小工具
  5. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
  6. 揭露QPS增高后的秘密
  7. linux 防火墙配置
  8. (转)Linux下安装Matlab2014及破解
  9. 能源项目xml文件标签释义--CommonsMultipartResolver
  10. hbm2ddl
  11. js 完成对图片的等比例缩放的方法
  12. JAVA布局管理器
  13. 关于var(string)++的类型自动转换
  14. 【转】使用DirectUI技术实现QQ界面
  15. dotpeek的导出
  16. R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
  17. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
  18. link rel=alternate网站换肤功能
  19. leecode第十四题(最长公共前缀)
  20. gojs 破解版

热门文章

  1. centos安装net-speeder
  2. 通过AWS的DHCP自动获取的IP地址是否会发生改变?
  3. MyBatis对象关联关系----多对多的保存与查询
  4. 51nod 1254 最大子段和 V2 ——单调栈
  5. 金山中学 rugular SRM 04 ——纪念我的第一次Ak
  6. 联系人数据存储Demo源代码
  7. Linux利用list_head结构实现双向链表
  8. Makefile 的 prequisite 執行順序 single multi thread
  9. strncpy 引起的思考,重新认识了strncpy这个函数【转】
  10. linux下面某些常用命令的用法【转】