link

$solution:$

好久没写数据结构了,那就写道简单题吧!

可以发现 $m\leq 50$,所以可以去取在 $[l,r]$ 中当价格相同时愉悦值最高的做完全背包 $dp$ 。

发现修改价格与愉悦值修改操作可以在线段树上维护,只要暴力修改在乱搞一下即可。

时间复杂度 $O(nm\log n+q\times m^2)$ 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
struct Node{
int val[];
void clear(){memset(val,-/,sizeof(val));}
}tmp[MAXN<<];
int n,m;
Node operator+(Node x1,Node x2){
Node x3;
for(int i=;i<=m;i++) x3.val[i]=max(x1.val[i],x2.val[i]);
return x3;
}
int w[MAXN],c[MAXN];
int tagw[MAXN<<],tagc[MAXN<<];
struct Segment{
void debug(Node t1){
for(int i=;i<=m;i++) printf("val(%d):%d\n",i,t1.val[i]);
return;
}
void build(int k,int l,int r){
if(l==r){
tmp[k].clear();
tmp[k].val[w[l]]=c[l];
return;
}
int mid=l+r>>;
build(k<<,l,mid),build(k<<|,mid+,r);
tmp[k]=tmp[k<<]+tmp[k<<|];
return;
}
Node Mw(int ps,int d){
if(!d) return tmp[ps];
Node t1;t1.clear();
for(int i=;i<=m;i++){
if((i+d)%m==) t1.val[m]=tmp[ps].val[i];
else t1.val[(i+d)%m]=tmp[ps].val[i];
}
return t1;
}
Node Mc(int ps,int d){
Node t1=tmp[ps];
for(int i=;i<=m;i++) t1.val[i]+=d;return t1;
}
void pushdownw(int k){
tmp[k<<]=Mw(k<<,tagw[k]),tmp[k<<|]=Mw(k<<|,tagw[k]);
tagw[k<<]+=tagw[k],tagw[k<<|]+=tagw[k];
tagw[k]=;return;
}
void pushdownc(int k){
tmp[k<<]=Mc(k<<,tagc[k]),tmp[k<<|]=Mc(k<<|,tagc[k]);
tagc[k<<]+=tagc[k],tagc[k<<|]+=tagc[k];
tagc[k]=;return;
}
void modify_w(int k,int l,int r,int x,int y,int d){
if(x<=l&&r<=y){
tmp[k]=Mw(k,d);
tagw[k]+=d;return;
}
pushdownw(k);
pushdownc(k);
int mid=l+r>>;
if(x<=mid) modify_w(k<<,l,mid,x,y,d);
if(mid<y) modify_w(k<<|,mid+,r,x,y,d);
tmp[k]=tmp[k<<]+tmp[k<<|];return;
}
void modify_c(int k,int l,int r,int x,int y,int d){
if(x<=l&&r<=y){
tmp[k]=Mc(k,d);
tagc[k]+=d;return;
}
pushdownw(k);
pushdownc(k);
int mid=l+r>>;
if(x<=mid) modify_c(k<<,l,mid,x,y,d);
if(mid<y) modify_c(k<<|,mid+,r,x,y,d);
tmp[k]=tmp[k<<]+tmp[k<<|];
return;
}
Node Query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y) return tmp[k];
pushdownw(k),pushdownc(k);
int mid=l+r>>;Node res;res.clear();
if(x<=mid) res=res+Query(k<<,l,mid,x,y);
if(mid<y) res=res+Query(k<<|,mid+,r,x,y);
tmp[k]=tmp[k<<]+tmp[k<<|];
return res;
}
}segment;
int q,f[];
signed main(){
// freopen("1.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++) c[i]=read();
q=read();
segment.build(,,n);
while(q--){
int opt=read(),l=read(),r=read();
if(opt==){
int d=read();
segment.modify_w(,,n,l,r,d);
}
if(opt==){
int d=read();
segment.modify_c(,,n,l,r,d);
}
if(opt==){
memset(f,-/,sizeof(f));
f[]=;
Node g=segment.Query(,,n,l,r);
for(int i=;i<=m;i++)
for(int j=i;j<=m;j++) f[j]=max(f[j],f[j-i]+g.val[i]);
int sum=,Xor=;
for(int i=;i<=m;i++) f[i]=max(f[i],f[i-]);
for(int i=;i<=m;i++) sum+=f[i],Xor^=f[i];
printf("%lld %lld\n",sum,Xor);
}
}
}

最新文章

  1. CentOS 7 网络配置工具
  2. 说不尽的MVVM(4) – 发号施令的Command
  3. bjfu1299 stl使用
  4. 【阿里云产品公测】与云引擎ACE第一次亲密接触
  5. CPU/ABI显示No system images installed for this target的解决方案
  6. iOS 的一点理解(一) 代理delegate
  7. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
  8. SQLServer -- 递归查询树结构表
  9. js图片放大镜 可动态更换图片
  10. [Swust OJ 567]--老虎在不在笼子里(凸包问题)
  11. UVA 10201 Adventures in Moving - Part IV(dp)
  12. 原生js封装添加class,删除class
  13. Ruby on Rails,一对多关联(One-to-Many)
  14. [elk]elasticsearch实现冷热数据分离
  15. netty 为什么用nio 不用 aio
  16. SQL server 数据库的数据完整性
  17. 初次安装hive-2.1.0启动报错问题解决方法
  18. mdio rgmii mac phy简单了解
  19. appium镜像设置
  20. pycharm+gitee

热门文章

  1. java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作
  2. watch和computed
  3. vue-cli3.0以上项目中引入jquery的方法
  4. JavaScript变量和字面量
  5. 如何使 C++ 的 StringBuilder 提升 4350% 的性能?
  6. java 8 接口默认方法
  7. Vue中v-for配合使用Swiper插件问题
  8. 【LOJ6225&amp;网络流24题】火星探险问题(费用流)
  9. UITabbarController &amp; UITabbar 学习
  10. Linux root用户与普通用户时间不一致