【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}\) ,然后我们就可以根据平衡树的基本操 ...
随机推荐
- java保留两位小数4种方法(转载)
喵喵最近经常遇到小数点保留的问题,转载一篇Java里面的几种小数点位数控制方法. 这是转载的原地址:https://www.cnblogs.com/chenrenshui/p/6128444.html ...
- OpenMPI源码剖析:网络通信原理(二) 如何选择网络协议?
因为比较常用的是 TCP 协议,所以在 opal/mca/btl/tcp/btl_tcp.h 头文件中找到对应的 struct mca_btl_tcp_component_t { mca_btl_ba ...
- 一篇带你读懂TCP之“滑动窗口”协议
前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- linq to sql中的自动缓存(对象跟踪)
linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的“记录”会自动转成“对象”),如果该记录已经被select过,默认情况下会被自动缓存下来,下次 ...
- 关于maven:调整你的maven的jdk版本为 xxxx
找到你的.m2文件 在里面添加一下信息 实例 将其更改成1.7 <profiles> <profile> <id>jdk-1.7</id> <! ...
- 第二章:蓝色巨人 IBM公司
COBOL(面向商业的通用语言) DEC(数字设备公司)华生实验室 造成失败的原因: 1,没有经营终端消费型产品 2,技术的流失 3.没有在意对手 成为的方法:合并,保守,谨慎 研究员的工作: 1,发 ...
- 动态规划刷题集python代码
1 爬楼梯(Fibonacci) #有一楼梯共M级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? def fun(m): c = [0]*m c[0] = 1 c[1] = 2 for i ...
- Vue 和 angular
vue适合移动端的项目,而angular更适合运用于Pc端的项目.
- 在ubuntu下运行python脚本
转自http://www.cnblogs.com/hester/p/5575658.html 1. 运行方式一 新建test.py文件: 1 touch test.py 然后vim test.py打开 ...