【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包
【题目】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop
【题意】给定一个长度为n的物品序列,每个物品有价值、不超过m的重量。要求支持以下三种操作:1.物品价值区间加减,2.物品重量区间加(超过m部分取模),3.区间物品求解容量为m的完全背包数组。\(n \leq 2*10^5,m \leq 60,Q \leq 3*10^4\)。
【算法】线段树+完全背包
显然,每个重量只需要保留价值最大的物品。
然后就很简单了,线段树每个维护一个数组c[x]表示重量x的最大价值,区间循环和区间加减,每次询问将区间m个重量的最大价值拿出来做完全背包。注意初始化为-inf(否则相当于有价值为0的物品,之后进行物品价值加减后就会干扰答案了)。
复杂度\(O(nm\ \ log\ \ n+m^2)\)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lowbit(x) (x&-x)
bool isdigit(char c){return c>='0'&&c<='9';}
int read(){
int s=0,t=1;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-1;
do{s=s*10+c-'0';}while(isdigit(c=getchar()));
return s*t;
}
using namespace std;
const int maxn=200010,M=70;
const ll inf=1ll<<60;
int n,m,w[maxn],v[maxn];
ll C[M],f[M],D[M];//chong fu X
struct tree{int l,r,w_delta,v_delta;ll c[M];}t[maxn*4];
ll max(ll a,ll b){return a<b?b:a;}
void up(int k){
for(int i=1;i<=m;i++)t[k].c[i]=max(t[k<<1].c[i],t[k<<1|1].c[i]);
}
void w_modify(int k,int x){
t[k].w_delta+=x;
for(int i=1;i<=m;i++)D[(i-1+x)%m+1]=t[k].c[i];
for(int i=1;i<=m;i++)t[k].c[i]=D[i];
}
void v_modify(int k,int x){
t[k].v_delta+=x;
for(int i=1;i<=m;i++)t[k].c[i]+=x;
}
void down(int k){
if(t[k].w_delta){
w_modify(k<<1,t[k].w_delta);w_modify(k<<1|1,t[k].w_delta);
t[k].w_delta=0;
}
if(t[k].v_delta){
v_modify(k<<1,t[k].v_delta);v_modify(k<<1|1,t[k].v_delta);
t[k].v_delta=0;
}
}
void build(int k,int l,int r){
for(int i=1;i<=m;i++)t[k].c[i]=-inf;//-inf no influense
t[k].l=l;t[k].r=r;
if(l==r){t[k].c[w[l]]=v[l];return;}//return
int mid=(l+r)>>1;
build(k<<1,l,mid);build(k<<1|1,mid+1,r);
up(k);
}
void w_fix(int k,int l,int r,int x){
if(l<=t[k].l&&t[k].r<=r){w_modify(k,x);return;}
down(k);//
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)w_fix(k<<1,l,r,x);
if(r>mid)w_fix(k<<1|1,l,r,x);
up(k);
}
void v_fix(int k,int l,int r,int x){
if(l<=t[k].l&&t[k].r<=r){v_modify(k,x);return;}
down(k);//
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)v_fix(k<<1,l,r,x);
if(r>mid)v_fix(k<<1|1,l,r,x);
up(k);
}
void query(int k,int l,int r){
if(l<=t[k].l&&t[k].r<=r){
for(int i=1;i<=m;i++)C[i]=max(C[i],t[k].c[i]);
return;//return
}
down(k);//use down
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)query(k<<1,l,r);
if(r>mid)query(k<<1|1,l,r);
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)w[i]=read();
for(int i=1;i<=n;i++)v[i]=read();
build(1,1,n);
int Q=read();
while(Q--){
int kind=read(),l=read(),r=read();
if(kind==1){
int x=read();
w_fix(1,l,r,x);
}
else if(kind==2){
int x=read();
v_fix(1,l,r,x);
}
else{
for(int i=1;i<=m;i++)C[i]=0,f[i]=0;//long long
query(1,l,r);
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j++){
f[j]=max(f[j],f[j-i]+C[i]);
}
}
ll ans=0;for(int i=1;i<=m;i++)ans+=f[i];printf("%lld ",ans);//long long
ans=0;for(int i=1;i<=m;i++)ans^=f[i];printf("%lld\n",ans);
}
}
return 0;
}
这种线段树套数组的做法经典而常见。
【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包的更多相关文章
- [THUPC2018]弗雷兹的玩具商店(线段树,背包)
最近状态有点颓,刷刷水题找找自信. 首先每次询问就是完全背包.可以 $O(m^2)$. 由于每个物品都可以用无数次,所以对于价格相同的物品,我们只用考虑愉悦度最高的. 直接上线段树.$val[i]$ ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- [THUPC2018] 弗雷兹的玩具商店
link $solution:$ 好久没写数据结构了,那就写道简单题吧! 可以发现 $m\leq 50$,所以可以去取在 $[l,r]$ 中当价格相同时愉悦值最高的做完全背包 $dp$ . 发现修改价 ...
- 「LuoguP3865」 【模板】ST表 (线段树
题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) 题目描述 给定一个长度为 N 的数列,和 M 次询问,求出每一 ...
- 「BZOJ1537」Aut – The Bus(变形Dp+线段树/树状数组 最优值维护)
网格图给予我的第一反应就是一个状态 f[i][j] 表示走到第 (i,j) 这个位置的最大价值. 由于只能往下或往右走转移就变得显然了: f[i][j]=max{f[i-1][j], f[i][j-1 ...
- LOJ 3094 「BJOI2019」删数——角标偏移的线段树
题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...
- 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法
[题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...
- 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
[题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...
- 「luogu3380」【模板】二逼平衡树(树套树)
「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...
随机推荐
- win10引导错误的修复(内容系转载)
#!尊重原作者,再此声明此内容属于网络转载,只是为了能保留下来方便日后查阅!!! win10误删引导文件,0xc0000098的解决方案,bcd引导文件受损情况分析 一.※相对简单的解决方法,对应的情 ...
- Linux内核分析第一二章读书笔记
linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...
- Docker打DB2 9.7镜像采坑相关
概况:以centos:7.2.1511镜像为基础镜像,使用docker commit方式进行构建 步骤: 运行centos7.2.1511镜像(以特权模式运行,后续内核参数修改必需参数) dock ...
- nginx安装(转发)
Nginx("engine x")是一款轻量级的HTTP和反向代理服务器.相比于Apache.lighttpd等,它具有占有内存少.并发能力强.稳定性高等优势.它最常见的用途就是提 ...
- 新手上路 git你好
天哪,虽然我是一个学计算机的,但是我发现我的计算机学的真是……好吧不说了,言归正传. 这几天一直在着手于git,可能只是学了一个皮毛,结果也是不大尽人意,跟着别人学了学,鼓捣了鼓捣,还是有点小小的收 ...
- 第一个spring冲刺总结及后诸葛亮报告(附团队贡献分)
眨眼就完结了第一阶段的冲刺了,之前因为学校停电停水等诸多原因而导致冲刺完毕时间的推迟. 第一阶段总体是做到了运算的功能,只是一些基本的功能实现,但能保证的容错性能较高. 1.在普遍的四则运算中都能见到 ...
- 使用maven的插件进行maven项目的打包
1 maven项目打包的插件有3种 maven-jar-plugin maven-assembly-plugin maven-shade-plugin 2 maven-jar-plugin 现在要新增 ...
- resultMap 表示转换字段后 resultType 表示没·有转换字段
resultMap 表示转换字段后 resultType 表示没·有转换字段
- 在VMware Workstation上安装Ubuntu 16.04 Server操作系统
Ubuntu 16.04 Server的下载 http://www.ubuntu.org.cn/download/server 按空格键(Space)选中第一个ssh服务 成功!
- python netifaces usage
1. install python dev sudo apt-get install python-dev 2.download src code and install https://pypi.p ...