2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)
传送门
题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi,vi),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODMOD 取模后余数在[l,r][l,r][l,r]中,使得这些装备的战斗力之和最大。
思路:直接看询问貌似可以用010101背包。
然后由于这个双端队列只能在队首和队尾弹入弹出,那么考虑按时间线段树分治,这样每个元素都相当于一次占据logloglog个区间的修改操作。
于是我们先把所有修改操作下放,然后按照线段树的顺序来进行010101背包即可。
注:在博主经过尝试无法ac之后通过翻阅其他A题神犇的代码之后发现他们在最开始多输入了一个数,貌似加了这个无关紧要的read才能过(雾
代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef pair<int,int> pii;
typedef long long ll;
const int N=5e4+5;
int n,mod,tim=0;
bool is[N];
vector<pii>val[N<<2];
pii qry[N];
ll f[N][505];
inline void update(int p,int l,int r,int ql,int qr,pii v){
if(ql<=l&&r<=qr){val[p].push_back(v);return;}
if(qr<=mid)update(lc,l,mid,ql,qr,v);
else if(ql>mid)update(rc,mid+1,r,ql,qr,v);
else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,mid+1,qr,v);
}
inline void solve(int p,int l,int r){
int now=tim;
for(ri i=0;i<val[p].size();++i)for(ri j=0;j<mod;++j)
f[tim+i+1][(j+val[p][i].fi)%mod]=max(f[tim+i][(j+val[p][i].fi)%mod],f[tim+i][j]+val[p][i].se);
tim+=val[p].size();
if(l==r){
if(is[l]){
ll ans=-0x3f3f3f3f;
for(ri i=qry[l].fi;i<=qry[l].se;++i)ans=max(ans,f[tim][i]);
cout<<(ans>=0?ans:-1)<<'\n';
}
tim=now;
return;
}
solve(lc,l,mid),solve(rc,mid+1,r),tim=now;
}
inline int trans(string s){
if(s=="IF")return 1;
if(s=="IG")return 2;
if(s=="DF")return 3;
if(s=="DG")return 4;
return 5;
}
int main(){
read(),n=read(),mod=read();
deque<pair<pii,int> >S;
for(ri t,a,b,i=1;i<=n;++i){
string op;
cin>>op;
t=trans(op);
pii v;
switch(t){
case 1:a=read(),b=read(),S.push_front(make_pair(pii(a%mod,b),i));break;
case 2:a=read(),b=read(),S.push_back(make_pair(pii(a%mod,b),i));break;
case 3:update(1,1,n,S.front().se,i-1,S.front().fi),S.pop_front();break;
case 4:update(1,1,n,S.back().se,i-1,S.back().fi),S.pop_back();break;
default:a=read(),b=read(),is[i]=1,qry[i]=pii(a,b);
}
}
while(S.size())update(1,1,n,S.front().se,n,S.front().fi),S.pop_front();
memset(f,-0x3f,sizeof(f)),f[0][0]=0,solve(1,1,n);
return 0;
}
2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)的更多相关文章
- 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月
考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...
- 【LOJ#6029】市场(线段树)
[LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...
- LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案
题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...
- 【Loj#535】花火(线段树,扫描线)
[Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...
- Loj #2570. 「ZJOI2017」线段树
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
- LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...
随机推荐
- 上海高校金马五校赛 F题:1 + 2 = 3?
链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...
- js,JavaScript,a标签onclick传递参数不对,A标签调用js函数写法总结
错误示例: <a href="javascript:waterLineEdit(${goods.goods_id})" >修改 </a> <!-- 浏 ...
- [转]github详细教程
GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath ...
- 游戏行业的女性拥有强大的新盟友:Facebook
据外媒 TheNextWeb 报道,Facebook 本周宣布其新的游戏行业女性倡议,致力于鼓励更多的女性加入游戏行业.这家社交媒体公司专注于提供榜样和成功故事,而这实际上是一种令人愉快的方式.虽然游 ...
- Python常用库大全,看看有没有你需要的
作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- JDBC、ODBC、OLE DB、ADO、ADOMD区别与联系
ODBC: (Open Database Connectivity,开放数据库互连),它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口).这些API利用SQL来完成其大部分任务 ...
- linq 动态判断
以前要不是使用扩展方法 要么使用如(t==2&&判断条件)||(s==1&&判断条件) 其实可以简单的实现扩展一个whereIf即可(abp实现),如下所示 ··· / ...
- ---转载---phython资料
整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. https://st ...
- javascript DOM基础操作
DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口).DOM描绘了一个层次化的节点树,运行开发人员添加.移除和修改页面的某一部分.DOM ...
- N! java
import java.util.*; import java.math.*; public class Num2{ public static void main(String args[]){ B ...