【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月
考试时候怎么就是没想到线段树分治呢?
题目描述
《贪玩蓝月》是目前最火爆的网页游戏。在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ 。在每种特定的情况下,你都要选出特征值的和对 $\rm MOD$ 取模后在一段范围内的装备,而角色死亡时自己的装备会爆掉。每个角色的物品槽可以看成一个双端队列,得到的装备会被放在两端,自己的装备爆掉也会在两端被爆。
现在我们有若干种事件和询问,如下所示:
IF w v
:在前端加入一件特征值为 $w$ 战斗力为 $v$ 的装备IG w v
:在后端加入一件特征值为 $w$ 战斗力为 $v$ 的装备DF
:删除最前端的装备DG
:删除最后端的装备QU l r
:在当前的装备中选取若干装备,他们的和对 $\rm MOD$ 取模后在 $[l, r]$ 中,使得这些装备的战斗力之和最大
为了锻炼你的水平,请尽量使用在线做法。
题目分析
做法一:线段树分治
考虑一下w,v强制在线的做法。
注意到这个在线是个“半在线”:因为虽然w,v是被加密过的,但是操作种类是可见的。那么就可以预先处理处每一个物品的存在时间区间,因此这样对操作进行线段树分治就是个离线问题了。
#include<bits/stdc++.h>
typedef long long ll;
const int maxn = ; int m,p,tag;
ll ans[maxn];
struct QRs
{
char opt[];
int l,r;
}qr[maxn];
struct Opt
{
int s,t,w,v;
Opt(int a=, int b=, int c=, int d=):s(a),t(b),w(c),v(d) {}
}rec[maxn];
struct node
{
ll f[],g[];
void init()
{
memset(f, -0x3f3f3f3f, sizeof f), f[] = ;
}
void update(int w, int v)
{
for (int i=; i<p; i++) g[i] = f[i];
for (int i=; i<p; i++) //x+w=i
f[i] = std::max(f[i], g[(i-w+p)%p]+v);
}
ll query(int l, int r)
{
ll ret = -;
for (int i=l; i<=r; i++) ret = std::max(f[i], ret);
return ret;
}
}sta;
typedef std::vector<Opt> vec;
std::deque<int> deq;
vec opt; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void solve(int l, int r, vec opt, node sta)
{
vec L,R;
int mid = (l+r)>>;
for (int i=, mx=opt.size(); i<mx; i++)
{
int s = opt[i].s, t = opt[i].t;
if (s <= l&&r <= t) sta.update(opt[i].w, opt[i].v);
else{
if (s <= mid) L.push_back(opt[i]);
if (t > mid) R.push_back(opt[i]);
}
}
if (l==r){
if (qr[l].opt[]=='Q') ans[l] = sta.query(qr[l].l, qr[l].r);
}else solve(l, mid, L, sta), solve(mid+, r, R, sta);
}
int main()
{
scanf("%*d"), m = read(), p = read();
for (int i=, tmp; i<=m; i++)
{
scanf("%s",qr[i].opt);
if (qr[i].opt[]=='I'){
qr[i].l = read()%p, qr[i].r = read(), ++tag;
if (qr[i].opt[]=='F') deq.push_front(tag);
else deq.push_back(tag);
opt.push_back(Opt(i, m, qr[i].l, qr[i].r));
}
if (qr[i].opt[]=='Q')
qr[i].l = read(), qr[i].r = read();
if (qr[i].opt[]=='D'){
if (qr[i].opt[]=='F')
tmp = deq.front(), deq.pop_front();
else tmp = deq.back(), deq.pop_back();
opt[tmp-].t = i-;
}
}
sta.init();
solve(, m, opt, sta);
for (int i=; i<=m; i++)
if (qr[i].opt[]=='Q') printf("%lld\n",ans[i]);
return ;
}
做法二:思维题 栈 启发式
可能要先咕着
【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月的更多相关文章
- loj #6515. 「雅礼集训 2018 Day10」贪玩蓝月
\(\color{#0066ff}{输入样例}\) 0 11 10 QU 0 0 QU 1 9 IG 14 7 IF 3 5 QU 0 9 IG 1 8 DF QU 0 4 IF 1 2 DG QU ...
- 「雅礼集训 2018 Day10」贪玩蓝月
题目链接 题意分析 我们考虑维护两个栈 分别支持左边的插入删除以及右边的插入删除 然后对于两两个栈的我们需要用背包求出最优答案 注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...
- 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色
好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...
- [loj 6496]「雅礼集训 2018 Day1」仙人掌
传送门 Description 给出一张 \(n\)个点 \(m\)条边的无向连通图,其中每条边至多属于一个简单环,保证没有自环,可能有重边.你需要为其中每条边定向,其中第 \(i\)个点的出度不能超 ...
- LOJ #6509. 「雅礼集训 2018 Day7」C
神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...
- LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
- LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)
题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...
随机推荐
- ·ios 圆角
uiview 直接设置 view.layer.cornerRadius = 5 uiimageview 还需要在设置view.layer.masksToBounds = true .uiview设置这 ...
- STP-14-MST配置
在配置MST之前,工程师要进行一定程度的预先规划.首先,必须决定是否应该使用多区域设计,以及如何设置边界.多区域的设计使得每个区域都有独立的MST实例编号.VLAN到实例的映射,以及独立的实例根.整体 ...
- mysql错误之errorcode 1215问题
1.此类问题出现时我们往往会迫不及待的去百度,但是问题偶尔也不是我们想的那样,比如我本次犯下的错误如下: 上图是我给表添加外键约束的时候的sql.下图是我建的表,问题出哪里了?原来是我的数据库根本没有 ...
- MySQL库相关操作
========MySQL库相关操作====== 一.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信 ...
- Linux —— ps命令
Ps命令 作用 显示瞬间进程的状态,并不动态连续: 如果想对进程进行实时监控应该用top命令: 对进程的管理,可以使用kill命令发送信号 Ps PID : 运行着的命令的进程编号 TTY : 命令所 ...
- PartTime_20160608
1. http://www.680.com/pojie/398074.html 2. http://www.680.com/pojie/398865.html 3.
- PostgreSQL 导出导入表中指定查询数据
创建一临时表: create table test_view as select * from test where date(to_timestamp(endtime))>='2012-09- ...
- css常用操作
对齐操作 1.使用margin属性进行水平对齐 margin-left:auto; margin-right:auto; 2.使用position属性进行左右对齐 3.使用fl ...
- fastjson格式化输出内容
引入fastjson <!--fastjson--><dependency> <groupId>com.alibaba</groupId> <ar ...
- swift学习笔记3-4
再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己. 三.运算符+表达式 swift允许重载运算符,比如 “+”你可以重载它 后续会详细介绍 赋值运算符 pass 算 ...