最近状态有点颓,刷刷水题找找自信。

首先每次询问就是完全背包。可以 $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]弗雷兹的玩具商店(线段树,背包)的更多相关文章

  1. [THUPC2018] 弗雷兹的玩具商店

    link $solution:$ 好久没写数据结构了,那就写道简单题吧! 可以发现 $m\leq 50$,所以可以去取在 $[l,r]$ 中当价格相同时愉悦值最高的做完全背包 $dp$ . 发现修改价 ...

  2. 【LibreOJ】#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop 线段树+完全背包

    [题目]#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop [题意]给定一个长度为n的物品序列,每个物品有价值.不超过m的重量.要求支持以下三种操作:1.物品价值区间加减,2.物 ...

  3. bzoj 1307/1318 玩具 线段树+记录时间戳

    玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 743  Solved: 404[Submit][Status][Discuss] Descrip ...

  4. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  5. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  6. 【BZOJ4137】火星商店问题(线段树分治,可持久化Trie)

    [BZOJ4137]火星商店问题(线段树分治,可持久化Trie) 题面 洛谷 BZOJ权限题 题解 显然可以树套树,外层线段树,内层可持久化Trie来做. 所以我们需要更加优美的做法.--线段树分治. ...

  7. [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)

    [FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...

  8. 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)

    点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...

  9. 【题解】P4585 [FJOI2015]火星商店问题(线段树套Trie树)

    [题解]P4585 [FJOI2015]火星商店问题(线段树套Trie树) 语文没学好不要写省选题面!!!! 题目大意: 有\(n\)个集合,每个集合有个任意时刻都可用的初始元素.现在有\(m\)个操 ...

随机推荐

  1. svg path 解析

    <pre><svg width="100%" height="100%" version="1.1" xmlns=&quo ...

  2. WPF 鼠标移动时触发图片旋转(非动画)

    非动画,只是简单的触发器. 主要是针对旋转的写法. 代码 <Grid> <Image x:Name="image" Source="nifi3.gif& ...

  3. LeetCode Contest 166

    LeetCode Contest 166 第一次知道LeetCode 也有比赛. 很久没有打过这种线上的比赛,很激动. 直接写题解吧 第一题 很弱智 class Solution { public: ...

  4. 使用VisualStudio或VisualStudio Code作为代码比较工具

    最近改了了几个还是用SVN托管的老项目,用的客户端是TortoiseSVN,本身这个工具比较好用,就是那个内置的比较文件差异的Diff工具太简陋了,由于TortoiseSVN支持第三方Diff查看器的 ...

  5. RSA加密方法

    /// <summary>        /// RSA加密        /// </summary>        /// <param name="dat ...

  6. 改变src图片不更新

    var url = response + "?r" + Math.random();[完美解决修改src不更新图片]$('#loginimage').attr("src& ...

  7. php 使用fsockopen 发送http请求

    需求背景 在公司开发这么一个需求,每天三次定时催付待客服催付状态的订单,设定每天15.16.17点三次执行job任务来给一批订单打电话催付,需要三个时间点都把待客服催付的订单拨打一遍电话,根据数据组统 ...

  8. Java性能 -- CAS乐观锁

    synchronized / Lock / CAS synchronized和Lock实现的同步锁机制,都属于悲观锁,而CAS属于乐观锁 悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,而大量阻塞 ...

  9. PC端页面适应不同的分辨率的方法

    原文链接:https://www.jianshu.com/p/4850a7b22228 一.根据不同的分辨率,加载不同的CSS样式文件 这个方法的思路是,分别针对800.1280.1440.1600. ...

  10. 微信小程序 自定义头部导航栏和导航栏背景图片 navigationStyle

    ​ 这两天因为要做一个带背景的小程序头,哭了,小程序导航栏有背景也就算了,还得让导航栏上的背景顺下来,心态小崩.现在可以单独设置一个页面的小程序头了,但是前提是要微信7.0以上的版本,考虑到兼容性问题 ...