Solution

离线做法很简单,就是线段树分治,不过复杂度是 q m o d log ⁡ qmod\log qmodlog。
考虑在线做法,在线段树分治中,我们并没有利用到删除以及加入都只会在两端进行这个性质,我们考虑用两个栈分别维护两端,每次加入一个数就暴力做背包,删除就删除栈顶。当某一个栈被删空了之后,就把现有的数均等分成两份,扔进两个栈中暴力重构。
询问的话,一开始也想过分成两段维护,但一直没有办法快速合并两段的状态,其实并不需要合并起来,枚举第一个栈中贡献的余数,那么就相当于询问另一栈中的区间最大值,可以发现每次询问的区间都是长度相等的一段,所以可以用单调队列维护最大值。
复杂度是 q m o d qmod qmod。

Code

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=50010;
const LL inf=4485090715960753727LL;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
int m,mod,w[Maxn<<1],v[Maxn<<1];
LL s1[Maxn][505],s2[Maxn][505];
int t1=0,t2=0,l=50001,r=50000,mid=50000;
char op[5];
void clear1(int x){memset(s1[x],-63,sizeof(s1[x]));}
void clear2(int x){memset(s2[x],-63,sizeof(s2[x]));}
void add1(int x)
{t1++;clear1(t1);memcpy(s1[t1],s1[t1-1],sizeof(s1[t1]));for(int i=0;i<mod;i++){int j=(i+w[x])%mod;s1[t1][j]=max(s1[t1][j],s1[t1-1][i]+v[x]);}
}
void add2(int x)
{t2++;clear2(t2);memcpy(s2[t2],s2[t2-1],sizeof(s2[t2]));for(int i=0;i<mod;i++){int j=(i+w[x])%mod;s2[t2][j]=max(s2[t2][j],s2[t2-1][i]+v[x]);}
}
vector<int>h[1005];
int tot,to[505];LL Ans[505],a[1005];
int q[505];
LL query(int L,int R)
{LL re=-inf;tot=0;int len=R-L+1;for(int i=0;i<mod+mod;i++)h[i].clear();for(int i=0;i<mod;i++){int ll=L-i,rr=R-i;if(ll<0)ll+=mod;if(rr<0)rr+=mod;if(ll>rr)rr+=mod;h[rr].push_back(to[i]=++tot);}int head=1,tail=0;for(int i=0;i<mod+mod;i++){LL x=s2[t2][i%mod];a[i]=x;while(head<=tail&&i-q[head]+1>len)head++;while(head<=tail&&x>=a[q[tail]])tail--;q[++tail]=i;for(int j=0;j<h[i].size();j++)Ans[h[i][j]]=a[q[head]];}for(int i=0;i<mod;i++)if(s1[t1][i]>=0&&Ans[to[i]]>=0)re=max(re,s1[t1][i]+Ans[to[i]]);if(re<=-inf)return -1;return re;
}
void rebuild()
{mid=l+r>>1;t1=t2=0;clear1(0);clear2(0);s1[0][0]=s2[0][0]=0;for(int i=mid;i>=l;i--)add1(i);for(int i=mid+1;i<=r;i++)add2(i);
}
int main()
{read();m=read(),mod=read();clear1(0),clear2(0);s1[0][0]=s2[0][0]=0;while(m--){scanf("%s",op);if(op[0]=='I'){if(op[1]=='F')l--,w[l]=read()%mod,v[l]=read(),add1(l);else r++,w[r]=read()%mod,v[r]=read(),add2(r);}else if(op[0]=='Q'){int L=read(),R=read();printf("%lld\n",query(L,R));}else{if(op[1]=='F'){l++,t1--;if(l>mid)rebuild();}else{r--,t2--;if(r<=mid)rebuild();}}}
}

[LOJ]#6515. 「雅礼集训 2018 Day10」贪玩蓝月相关推荐

  1. [LOJ6515]「雅礼集训 2018 Day10」贪玩蓝月

    Description 要求维护一个双端队列,支持: 在队尾/队头添加一个体积为w,价值为v的物品 删除队尾/队头的物品 询问从所有物品中选出若干个,满足体积和对Mod取模后在[l,r]内的价值的最大 ...

  2. 「雅礼集训 2018 Day10」贪玩蓝月

    大渣好,我四渣渣辉,点一下,玩一年,装备不花一分钱,说话战斗,罩杯回收,找一基友,极限到手. 0 元 VIP,3 天满级,一秒一刀 999,装备全爆 666,广告做得再牛,不如进服遛一遛! 古天乐绿了 ...

  3. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

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

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

  5. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  6. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  7. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

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

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

  9. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 '0','1','?' ,其中 '?' 至多在每个串中出现1次,它可以被替换为 '0' 或 '1' .问是否可能任意两个不同的串不满足 ...

最新文章

  1. 判断JS对象是否拥有某属性两种方式
  2. 12个现实世界中的机器学习真相
  3. 怎么用odbc连接mysql数据库连接_PowerDesigner通过ODBC来实现Mysql数据库的连接操作...
  4. JUnit 5和Selenium –改善项目配置
  5. 【JAVA】StringTokenizer 迭代方式对字符串进行分割
  6. 智能排班系统、班次、班表、考勤、年假、调休、审批、请假、培训、值班、换班、加班、工时、自动排班、智能预测、人力需求预测、授权、团队、锁定量排、规则权重设置、菜单、角色、数据监控、工作台、axure
  7. 使用FZip创建压缩文件保存到桌面
  8. 基于JSP的图书管理系统
  9. win7便签点击删除按钮的时候不弹出提示框
  10. 计算机职业素养论文1500字,提升道德素养论文_职业素养论文2000字_工程师职业素养结课论文1500字...
  11. 二维数组传参 实例详解
  12. RabbitMQ高可用--Quorum Queue(仲裁队列)的原理
  13. 使用python requests 爬取妹子图网站图片
  14. 窗帘轨道怎么安装?方法有哪些?-江南爱窗帘十大品牌
  15. CSS3绘画卡通形象
  16. 下拉多选checkbox
  17. Vue2 的 diff 算法
  18. STM32F429 以太网MAC滤波应用说明
  19. 2020VIVO春招编程题手机解锁图案
  20. 微信小程序与Netty实现的WebSocket聊天程序

热门文章

  1. 超级好的6款办公软件,你用过几款呢?
  2. 抖音原创视频如何制作?鹰迪电子商务
  3. 网易云音乐导出歌单-速食版
  4. 2020.04.10 【ABAP随笔】- ABAP面试分享
  5. 岑文初VS. 杨海朝
  6. 天猫菜鸟强势宣布!春节不休,年货照常买照常送!
  7. 7-6 查询水果价格
  8. 学计算机颈椎,长期玩电脑颈椎病
  9. Unity 屏幕模糊效果
  10. 扫描器s-scan下载安装功能应用