[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\)个操 ...
随机推荐
- python中count和index
str = [1,2,3,4,5] #定义一个列表 str = 3 #列表3 str [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] str.count(1 ...
- 文件安全复制之 FastCopy
FastCopy是Windows平台上最快的文件拷贝.删除软件.由于其功能强劲,性能优越,一时间便超越相同类型的所有其他软件.由于该软件十分小巧,你甚至可以在安装后,直接将安装目录中的文件复制到任何可 ...
- [STL] UVA 10815 安迪的第一个字典 Andy's First Dictionary
1.set 集合 哦....对了,set有自动按照字典序排序功能..... 声明和插入操作 #include <cstdio> #include <vector> #inclu ...
- LuoguP5290 [十二省联考2019]春节十二响 | 启发式合并
还有33天就要高考了,我在干啥-- 题目概述 一棵有根树,每个节点有权值. 要求把所有节点分成组,具有祖先-后代关系的两个节点不能被分到同一组. 每一组的代价是所包含的节点的最大权值,最小化所有组的代 ...
- 【洛谷5437】【XR-2】约定(拉格朗日插值)
[洛谷5437][XR-2]约定(拉格朗日插值) 题面 洛谷 题解 首先发现每条边除了边权之外都是等价的,所以可以考虑每一条边的出现次数. 显然钦定一条边之后构成生成树的方案数是\(2*n^{n-3} ...
- Python - 常规操作Excel - 第二十六天
前言 作为一名资深程序员,通过代码熟练操作Excel是必不可少的技能,本章主要讲解Python通过openpyxl第三方库(官方文件说明)对Excel进行操作,使Excel程序化操作更为简单快捷. o ...
- Subversion——密码保存位置
Subversion——密码保存位置 摘要:本文主要说明了Subversion在电脑上保存密码的位置. 起因 在向本地电脑上的文件夹里下载程序代码的时候,发现输入了地址之后就能直接下载了,并没有提示输 ...
- java 图书馆初级编写
import java.util.Scanner; import java.util.Arrays; public class book { public static void main(Strin ...
- maven 学习---Maven添加远程仓库
默认情况下,Maven从Maven中央仓库下载所有依赖关系.但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到. 1. Java.net资源库 添加Java.ne ...
- OL7.7安装Oracle 11.2.0.4
安装环境准备工具 yum –y install oracle-rdbms-server-11gR2-preinstall 创建目录 mkdir -p /u01/app/oracle/product/1 ...