题目链接

题意分析

我们考虑维护两个栈

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

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

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

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. 大楼轮廓 · building-outline

    [抄题]: 水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度.大楼之间从远处看可能会重叠,求出 N  ...

  2. 解题报告-1012. Numbers With Repeated Digits

    Given a positive integer N, return the number of positive integers less than or equal to N that have ...

  3. Golang之反射(重点!!)

    1.反射:可以在运行时动态获取变量的相关信息 Import(“reflect”) 两个函数: reflect.TypeOf()//获取变量的类型,返回reflect.Type类型reflect.Val ...

  4. ecshop适配php

    https://www.cnblogs.com/xiwang6428/p/5460155.html

  5. UCI数据

    http://archive.ics.uci.edu/ml/datasets.html?format=&task=&att=&area=&numAtt=&num ...

  6. C#分布式事务解决方案-TransactionScope(转)

    出处:C#分布式事务解决方案-TransactionScope 引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我 ...

  7. Oracle 11g PL/SQL Developer登入时候报ORA-12638: 身份证明检索失败的解决办法(安装了6遍,吐血之作)

    1.报这个错的时候会弹出一个对话框,先点击终止 2.然后汇报出这个是错误的窗口,然后点击确认,但是不要关这个安装窗口也不要其他不必要操作,窗口最小化 3.找到product文件夹,一般在app文件里 ...

  8. CentOS 7下面配置静态IP

    CentOS 7.0系统是一个很新的版本哦,很多朋友都不知道CentOS 7.0系统是怎么去安装配置的哦,因为centos7.0与以前版本是有很大的改进哦. 说明:截止目前CentOS 7.x最新版本 ...

  9. Frames of Reference参考框架

    Frames of Reference参考框架 When describing the position and orientation of something (for example, your ...

  10. ASP.NET MVC Core的TagHelper (高级特性)

    这篇博文ASP.NET MVC Core的TagHelper(基础篇)介绍了TagHelper的基本概念和创建自定义TagHelper的方式,接着继续介绍一些新的看起来比较高级的特性.(示例代码紧接着 ...