题目链接

题意分析

我们考虑维护两个栈

分别支持左边的插入删除以及右边的插入删除

然后对于两两个栈的我们需要用背包求出最优答案

注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注意保持顺序

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」贪玩蓝月的更多相关文章

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

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

  2. 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 ...

  3. 【LOJ6513】「雅礼集训 2018 Day10」足球大战(数学题)

    点此看题面 大致题意: 已知主队每秒进球概率为\(p\),客队每秒进球概率为\(q\),求主队进球数大于客队的概率. 推式子 考虑枚举主队进球数\(i\),则客队进球数必然小于\(i\),因此可再枚举 ...

  4. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  5. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  6. 【loj - 6516】「雅礼集训 2018 Day11」进攻!

    目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...

  7. LOJ #6509. 「雅礼集训 2018 Day7」C

    神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...

  8. LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]

    题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...

  9. LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)

    题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...

随机推荐

  1. [leetcode]134. Gas Station加油站

      There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. Y ...

  2. CRC32加密算法原理

    [转]:https://blog.csdn.net/android_mnbvcxz/article/details/78902737

  3. vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化

    测试的时候发现,在选择模板.选择产品第二步第三步的时候.如果超出两行的话会盖住看不见,(因为高度所有统一都被写死了,又加了overflow~emmm~)所以要改成走马灯形式.如图: 那么问题来了,我步 ...

  4. 3 python之基础概要

    一: 与用户交互 1 什么事与用户交互 程序等待用户输入一些数据,程序执行完毕之后为用户反馈信息 2 为什么程序要与用户交互 为了让计算机像人一样和用户沟通 3 如何用: 在python3中:inpu ...

  5. FZU 1977 Pandora adventure (DP)

    题意:给定一个图,X表示不能走,O表示必须要走,*表示可走可不走,问你多少种走的法,使得形成一个回路. 析: 代码如下: #pragma comment(linker, "/STACK:10 ...

  6. dojo表格操作的简单示例(建立表格)

    代码示例: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...

  7. 好用的开关按钮——switchbutton

    1.简介 GitHub地址:https://github.com/zcweng/SwitchButton gradle:  repositories { mavenCentral() jcenter( ...

  8. 使用zookeeper自带的zkCli.sh客户端工具实现对zk的CURD常见操作详解

    一.zookeeper自带的 zkCli.sh 客户端工具 1. 应急和测试使用到的一个工具. 还有C# dirver java dirver (驱动)   二.driver的使用方式有两种 zkCl ...

  9. mysql查看数据库性能常用命令

    mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句: mysql> show variables; 一.慢 ...

  10. C语言/C++编程学习:和QT零距离接触的意义

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...