[THUPC2018]弗雷兹的玩具商店(线段树,背包)
最近状态有点颓,刷刷水题找找自信。
首先每次询问就是完全背包。可以 $O(m^2)$。
由于每个物品都可以用无数次,所以对于价格相同的物品,我们只用考虑愉悦度最高的。
直接上线段树。$val[i]$ 表示这个区间中价格为 $i$ 的物品中最大的愉悦度。如果没有这样的物品就是 -INF。
询问就把这个区间的所有 $val$ 取出来,做个完全背包就好了。
两种修改操作用个标记随便搞搞。分别是区间的每个数组平移,和区间加。
复杂度 $O(nm\log n+q(m^2+\log n))$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=,INF=1e9;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,m,q,c[maxn],v[maxn],tmp[],ctag[maxn*],vtag[maxn*];
ll f[];
struct node{
int val[];
bool vis[];
node operator+(const node &nd)const{
node ans;
ans.val[]=-INF;
FOR(i,,m) ans.val[i]=max(val[i],nd.val[i]);
return ans;
}
}seg[maxn*];
inline void setc(int o,int v){
FOR(i,,m) tmp[(i+v-)%m+]=seg[o].val[i];
FOR(i,,m) seg[o].val[i]=tmp[i];
ctag[o]=(ctag[o]+v)%m;
}
inline void setv(int o,int v){
FOR(i,,m) seg[o].val[i]+=v;
vtag[o]+=v;
}
inline void pushdown(int o){
if(ctag[o]){
setc(o<<,ctag[o]);
setc(o<<|,ctag[o]);
ctag[o]=;
}
if(vtag[o]){
setv(o<<,vtag[o]);
setv(o<<|,vtag[o]);
vtag[o]=;
}
}
void build(int o,int l,int r){
if(l==r){
FOR(i,,m) seg[o].val[i]=-INF;
seg[o].val[c[l]]=v[l];
return;
}
int mid=(l+r)>>;
build(lson);build(rson);
seg[o]=seg[o<<]+seg[o<<|];
}
void updatec(int o,int l,int r,int ql,int qr,int v){
if(l>=ql && r<=qr) return void(setc(o,v));
pushdown(o);
int mid=(l+r)>>;
if(mid>=ql) updatec(lson,ql,qr,v);
if(mid<qr) updatec(rson,ql,qr,v);
seg[o]=seg[o<<]+seg[o<<|];
}
void updatev(int o,int l,int r,int ql,int qr,int v){
if(l>=ql && r<=qr) return void(setv(o,v));
pushdown(o);
int mid=(l+r)>>;
if(mid>=ql) updatev(lson,ql,qr,v);
if(mid<qr) updatev(rson,ql,qr,v);
seg[o]=seg[o<<]+seg[o<<|];
}
node query(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return seg[o];
pushdown(o);
int mid=(l+r)>>;
if(mid<ql) return query(rson,ql,qr);
if(mid>=qr) return query(lson,ql,qr);
return query(lson,ql,qr)+query(rson,ql,qr);
}
int main(){
n=read();m=read();
FOR(i,,n) c[i]=read();
FOR(i,,n) v[i]=read();
build(,,n);
q=read();
while(q--){
int op=read(),l=read(),r=read();
if(op==) updatec(,,n,l,r,read());
else if(op==) updatev(,,n,l,r,read());
else{
node ans=query(,,n,l,r);
FOR(i,,m) f[i]=;
FOR(i,,m) FOR(j,,i) f[i]=max(f[i],f[i-j]+max(,ans.val[j]));
ll s1=,s2=;
FOR(i,,m) s1+=f[i],s2^=f[i];
printf("%lld %lld\n",s1,s2);
}
}
}
[THUPC2018]弗雷兹的玩具商店(线段树,背包)的更多相关文章
- [THUPC2018] 弗雷兹的玩具商店
link $solution:$ 好久没写数据结构了,那就写道简单题吧! 可以发现 $m\leq 50$,所以可以去取在 $[l,r]$ 中当价格相同时愉悦值最高的做完全背包 $dp$ . 发现修改价 ...
- 【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包
[题目]#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop [题意]给定一个长度为n的物品序列,每个物品有价值.不超过m的重量.要求支持以下三种操作:1.物品价值区间加减,2.物 ...
- bzoj 1307/1318 玩具 线段树+记录时间戳
玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 743 Solved: 404[Submit][Status][Discuss] Descrip ...
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)
[BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)
点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...
- 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)
[题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...
随机推荐
- k8s web终端连接工具
k8 web terminal 一个k8s web终端连接工具,在前后端分离或未分离项目中心中,也可以把此项目无缝集成,开箱即用. 项目地址:https://github.com/jcops/k8-w ...
- re2c安装
wget https://kojipkgs.fedoraproject.org//packages/re2c/1.1.1/3.fc31/src/re2c-1.1.1-3.fc31.src.rpm 解 ...
- python yield from (二)
#pep380 #1. RESULT = yield from EXPR可以简化成下面这样 #一些说明 """ _i:子生成器,同时也是一个迭代器 _y:子生成器生产的值 ...
- LINQ 之 LookUp
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...
- Elasticsearch(ES) 创建索引
欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...
- Java生鲜电商平台-RBAC系统权限的设计与架构
Java生鲜电商平台-RBAC系统权限的设计与架构 说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上 ...
- Linux nodejs 安装以及配置环境
从官网中下载nodejs 打开官网 https://nodejs.org/en/download/ 复制拿到链接,下载nodejs wget https://nodejs.org/dist/v10.1 ...
- 面向对象的六大原则之 接口隔离原则——ISP
ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应 ...
- Redis事务控制
Redis事务控制 1.Redis事务控制的相关命令汇总 命令名 作用 MULTI 表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中. EXEC 执行MULTI后面命令队列中的所有命 ...
- 微信小程序使用函数防抖解决重复点击消耗性能问题
wxml: <view bindtap="doubleTap" bindtouchstart="touchStart" bindtouchend=&quo ...