传送门

题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(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背包)的更多相关文章

  1. 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月

    考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...

  2. 【LOJ#6029】市场(线段树)

    [LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...

  3. LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案

    题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...

  4. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  5. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  6. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  7. 【Loj#535】花火(线段树,扫描线)

    [Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...

  8. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  9. LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...

随机推荐

  1. checkbox/radio 样式修改

    只改颜色 input[type=radio],input[type=checkbox] { display: inline-block; vertical-align: middle; width: ...

  2. 支付宝小程序开发之与微信小程序不同的地方

    前言: 本文仅汇总微信小程序移植支付宝小程序过程中遇到的一些不同的地方,详细请参考官方开发文档. 网络请求: 对于网络请求,基本上改动不大,也就支付宝小程序没有responseType属性及响应码字段 ...

  3. vue项目微信分享之后路由链接被破坏怎么办

    异常现象: 多页面应用,路由采用hash模式,链接带有"#". 在微信中分享到朋友圈或好友时,分享出去的路由被破坏,打开分享的链接,路由中的“#”会被去掉并追加?fromTimel ...

  4. ABAP开发需要养成的习惯—程序修改数据库表

    ①此外将内表数据写入数据库,推荐用Modify而不是insert,因为会有些key一样的报dump loop at it_record. *          报错 *          insert ...

  5. Windows到Linux的文件上传、下载

    1.使用我们常用的Xshell登录工具,新建立一个远程会话,填写ip地址及用户名密码后,选择最下面的ZMODEM,填写下载的路径.加载的路径:2个路径可以一样也可以不一样: 2.在Linux主机上,安 ...

  6. PowerDesigner生成数据字典

    1.首先说明我使用的环境 2.打开PDM模型,右键-->NEW-->REPORT 3.数据字典编辑器(一些通用模型吧,自己可以再DIY) 4.选择Table-->List of Ta ...

  7. Repeater绑定数组

    前台代码: <asp:Repeater ID="rptarry" runat="server" >         <HeaderTempla ...

  8. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  9. pycharm 配置支持vue

    http://www.cnblogs.com/c-x-m/p/9229199.html

  10. sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时的感受

    sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时,mysql经常出现格式转换出错,不好导入  导入的数据量比较大时,还不如自己写个工具导入 今天在导oracle时,想 ...