「雅礼集训 2018 Day10」贪玩蓝月
题目链接
题意分析
我们考虑维护两个栈
分别支持左边的插入删除以及右边的插入删除
然后对于两两个栈的我们需要用背包求出最优答案
注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注意保持顺序
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 568
#define IL inline
#define M 56010
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int T,n,p;
int lg[M],top[2];
ll dp[2][M][N],ST[M][20];
pair<int,int> sta[2][M];
char s[10];
IL void init()
{
memset(dp,-0x3f,sizeof dp);
dp[0][0][0]=dp[1][0][0]=0;
for(R int i=1;(1<<i)<=50000;i++) lg[1<<i]=i;
for(R int i=1;i<=50000;++i) if(!lg[i]) lg[i]=lg[i-1];
// for(R int i=1;i<=20;++i) printf("%d%c",lg[i],(i==20 ? '\n':' '));
}
IL void insert(int knd,int now,pair<int,int> at)
{
sta[knd][now]=at;
for(R int i=0;i<p;++i) dp[knd][now][i]=dp[knd][now-1][i];
for(R int i=0;i<p;++i)
dp[knd][now][(i+at.first)%p]=max(dp[knd][now][(i+at.first)%p],dp[knd][now-1][i]+at.second)
}//我们是用背包维护两个栈的最优答案
IL void del(int knd)
{
if(top[knd]) {--top[knd];return;}
int mid=(top[knd^1]+1)>>1;
for(R int i=1;i<=mid;++i) sta[knd][mid-i+1]=sta[knd^1][i],sta[knd^1][i]=sta[knd^1][i+mid];
top[knd]=mid-1;top[knd^1]=(top[knd^1]&1 ? mid-1:mid);
for(R int i=1;i<=top[knd];++i) insert(knd,i,sta[knd][i]);
for(R int i=1;i<=top[knd^1];++i) insert(knd^1,i,sta[knd^1][i]);
//存在一个栈直接删空的情况的话
//我们从另一个栈中取走一半 加入这个栈
//从而保证复杂度
//并且还是需要再次背包的
}
IL ll getmax(int le,int ri)
{
int lx=lg[ri-le+1];
return max(ST[le][lx],ST[ri-(1<<lx)+1][lx]);
}
IL ll qury(int le,int ri)
{
ll res=-inf;
for(R int i=0;i<p;++i) ST[i][0]=dp[0][top[0]][i];
for(R int j=1;(1<<j)<=p;++j)
for(R int i=0;i+(1<<j)<=p;++i)
ST[i][j]=max(ST[i][j-1],ST[i+(1<<(j-1))][j-1]);
for(R int i=0;i<p;++i)
{
if(dp[1][top[1]][i]<0) continue;
int lx=(le-i+p)%p,rx=(ri-i+p)%p;
if(lx<=rx) res=max(res,dp[1][top[1]][i]+getmax(lx,rx));
else res=max(res,dp[1][top[1]][i]+max(getmax(0,rx),getmax(lx,p-1)));
}
//我们枚举一个栈的体积
//另一个栈的话 我们直接区间求最值就可以了
// printf("now %lld\n",res);
if(res==-inf) return -1;
else return res;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(T);read(n);read(p);init();
while(n--)
{
scanf("%s",s);
if(s[0]=='I')
{
int x,y;read(x);read(y);
insert(s[1]=='G',++top[s[1]=='G'],make_pair(x%p,y));
}
else if(s[0]=='D')
{
del(s[1]=='G');
}
else if(s[0]=='Q')
{
int le,ri;read(le);read(ri);
printf("%lld\n",qury(le,ri));
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
HEOI 2019 RP++
「雅礼集训 2018 Day10」贪玩蓝月的更多相关文章
- 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月
考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...
- 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 ...
- 【LOJ6513】「雅礼集训 2018 Day10」足球大战(数学题)
点此看题面 大致题意: 已知主队每秒进球概率为\(p\),客队每秒进球概率为\(q\),求主队进球数大于客队的概率. 推式子 考虑枚举主队进球数\(i\),则客队进球数必然小于\(i\),因此可再枚举 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...
- 【loj - 6516】「雅礼集训 2018 Day11」进攻!
目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...
- 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\)坐标里哪 ...
随机推荐
- 解决virtualbox共享文件夹没有访问权限的问题
Virtualbox是一款免费试用的虚拟机软件.基本功能完全可替代需要购买或crack的VMware. 在Windows主机上用Virtualbox搭建Linux虚拟机,虚拟机和主机之间传递文件最方便 ...
- loadrunner12-参数化以及参数化关联
1.选中需要进行参数化的字段,单击鼠标右键,选择使用参数替换--新建参数. 2.输入参数名称. 3.根据需要进行选择,我这边选择“Yes”. 4.再次选中刚刚参数化的字段,单击鼠标右键,选择 显示参数 ...
- Mybatis 实用篇(三)参数处理
Mybatis 实用篇(三)参数处理 sql 语句中的参数 parameterType 可以省略不写. 一.参数封装 1.1 单个参数处理 public interface UserMapper { ...
- jquery的理解
1.jquery的好处 简化js的复杂操作 不再需要关心兼容性 提供大量使用方法 2.jquery的设计思想 选择网页元素 -模拟css选择元素 -独有的表达式选择 -多种筛选方法 写法 -方法函数化 ...
- Mysql索引会失效的几种情况分析(转)
出处:http://www.jb51.net/article/50649.htm 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这 ...
- shell 脚本 实现随机数
现在我想要1~39之间的随机数该怎么做呢? date +%N 显示当前时间的纳秒 可以把这个数用来做随机数 但我只想要1~39的随机数,该怎么办呢 #! /bin/bash # echo $( ...
- 使用VPD解决EBS中信息屏蔽问题
本文描述的是2005年在一个项目中采用Oracle VPD技术解决同一个OU下按照不同办事处屏蔽销售订单的解决方案. VPD技术提供了数据库对象(表,同义词,视图)行级别访问的控制.关于VPD更多的信 ...
- pro2
#include<iostream> double sum(int n,dounle[]) { double array[100]; foe(int i=0;i<100;i++; ...
- 由于没有公钥,无法验证下列签名 Ubuntu
问题:执行 apt-get update 时错误 W: GPG 错误:https://apt.dockerproject.org ubuntu-trusty InRelease: 由于没有公钥,无法验 ...
- Jenkins 使用 Build Flow 插件配置工作流任务依赖
Jenkins 使用 Build Flow 插件配置工作流任务依赖 Jenkins 多任务依赖方式的配置方法目前可以通过MultiJob Project 或者Build Flow 或者Piplelin ...