传送门

题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(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. java深拷贝与浅拷贝

    1.调用Object类的clone方法必须实现Cloneable接口,clone属于浅拷贝. 2.可以通过java的反序列化机制进行深拷贝. 3.可以直接用apache提供的一些包进行深拷贝和浅拷贝, ...

  2. Lua面试题目

    1.Lua的特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提 ...

  3. 【python】入门指南:控制语句

    条件控制 if,if-else,if-elseif-else #!/bin/python a = 'test' if a == 'test': print('a is %s' %(a)) else: ...

  4. 【mysql】字段支持JSON类型

    mysql从5.7开始已经支持JSON类型的字段. 支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等. 但是这里和普通字段的修改和查找不同,涉及到一些JSON ...

  5. python之集合【set】

    初学python,今天晚上学习了set,做下set的总结,set的中文名也就是[集合],set的总结分为两部分,第一部分是set的创建,第二部分是set的操作,也就是set的功能:set的特点是无序的 ...

  6. jsp选项过长自动换行

    自动换行前是这样的 从源码发现“打发的所发生的7”所在span跨行了,宽度为整行的宽度,不再是自身的实际宽度(一列时所占的宽度) 我的思路是要把这个换行元素前加上<br/>,使得该元素换行 ...

  7. Linux系统不能解析域名

    问题:正在使用的Linux系统突然有一天不能解析域名gus.xxxxxxxx.com? # ping gus.xxxxxxxx.com ping: unknown host gus-xxxxxxxx. ...

  8. jdk与eclipse位数不一致出现的问题

    今天运行eclipse时出现了如下问题: 后来去网上查了一下,如果jdk版本的位数和eclipse安装版本所需要的版本位数不相同,就会出现如图所示的问题,导致eclipse打不开. 1.查询jdk版本 ...

  9. 永久激活win和office

    1.关闭自己安装的防护软件 2. 关闭电脑自带的防护软件 3.运行 KMSpico

  10. 微信小程序中用setData修改一个对象的属性值

    原创文章 1. Page({    data: {      items:{ //items为一个对象,is_like和like分别为其两个属性     is_like: 0,    like: 0 ...