传送门

题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi​,vi​),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODMOD 取模后余数在[l,r][l,r][l,r]中,使得这些装备的战斗力之和最大。


思路:直接看询问貌似可以用010101背包。

然后由于这个双端队列只能在队首和队尾弹入弹出,那么考虑按时间线段树分治,这样每个元素都相当于一次占据logloglog个区间的修改操作。

于是我们先把所有修改操作下放,然后按照线段树的顺序来进行010101背包即可。

注:在博主经过尝试无法ac之后通过翻阅其他A题神犇的代码之后发现他们在最开始多输入了一个数,貌似加了这个无关紧要的read才能过(雾

代码:

  1. #include<bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define lc (p<<1)
  5. #define rc (p<<1|1)
  6. #define mid (l+r>>1)
  7. #define ri register int
  8. using namespace std;
  9. inline int read(){
  10. int ans=0;
  11. char ch=getchar();
  12. while(!isdigit(ch))ch=getchar();
  13. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  14. return ans;
  15. }
  16. typedef pair<int,int> pii;
  17. typedef long long ll;
  18. const int N=5e4+5;
  19. int n,mod,tim=0;
  20. bool is[N];
  21. vector<pii>val[N<<2];
  22. pii qry[N];
  23. ll f[N][505];
  24. inline void update(int p,int l,int r,int ql,int qr,pii v){
  25. if(ql<=l&&r<=qr){val[p].push_back(v);return;}
  26. if(qr<=mid)update(lc,l,mid,ql,qr,v);
  27. else if(ql>mid)update(rc,mid+1,r,ql,qr,v);
  28. else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,mid+1,qr,v);
  29. }
  30. inline void solve(int p,int l,int r){
  31. int now=tim;
  32. for(ri i=0;i<val[p].size();++i)for(ri j=0;j<mod;++j)
  33. 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);
  34. tim+=val[p].size();
  35. if(l==r){
  36. if(is[l]){
  37. ll ans=-0x3f3f3f3f;
  38. for(ri i=qry[l].fi;i<=qry[l].se;++i)ans=max(ans,f[tim][i]);
  39. cout<<(ans>=0?ans:-1)<<'\n';
  40. }
  41. tim=now;
  42. return;
  43. }
  44. solve(lc,l,mid),solve(rc,mid+1,r),tim=now;
  45. }
  46. inline int trans(string s){
  47. if(s=="IF")return 1;
  48. if(s=="IG")return 2;
  49. if(s=="DF")return 3;
  50. if(s=="DG")return 4;
  51. return 5;
  52. }
  53. int main(){
  54. read(),n=read(),mod=read();
  55. deque<pair<pii,int> >S;
  56. for(ri t,a,b,i=1;i<=n;++i){
  57. string op;
  58. cin>>op;
  59. t=trans(op);
  60. pii v;
  61. switch(t){
  62. case 1:a=read(),b=read(),S.push_front(make_pair(pii(a%mod,b),i));break;
  63. case 2:a=read(),b=read(),S.push_back(make_pair(pii(a%mod,b),i));break;
  64. case 3:update(1,1,n,S.front().se,i-1,S.front().fi),S.pop_front();break;
  65. case 4:update(1,1,n,S.back().se,i-1,S.back().fi),S.pop_back();break;
  66. default:a=read(),b=read(),is[i]=1,qry[i]=pii(a,b);
  67. }
  68. }
  69. while(S.size())update(1,1,n,S.front().se,n,S.front().fi),S.pop_front();
  70. memset(f,-0x3f,sizeof(f)),f[0][0]=0,solve(1,1,n);
  71. return 0;
  72. }

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. 1. Two Sum (快速排序;有序数组的查找: 两个指针; 哈希表)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. unity实现3D物体上的事件监听处理

    想要在3D物体上实现全套事件监听处理: OnMouse系列 OnTrigger系列 OnPointer系列 OnDrag系列   1.在相机中添加Physics Raycaster组件 2.3D物体上 ...

  3. Unity3D研究院之设置自动旋转屏幕默认旋转方向

    如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的. Default Orien ...

  4. Mybatis 表名是变量时

    写语句时这样就可以了 <select id="selectTotal" resultType="java.util.Map" parameterType= ...

  5. [Java学习]面向对象-类的继承;方法覆盖

    一.类的继承 实现方法: public Class SubClass extends SuperClass{ } 继承最基本作用: 代码重用. 继承最重要的作用: 方法可以重写. 关于类的继承: 子类 ...

  6. stark组件之过滤操作【模仿Django的admin】

    一.先看下django的admin是如何实现过滤操作 首先在配置类中顶一个list_filter的列表,把要过滤的字段作为元素写i进去就可以了 class testbook(admin.ModelAd ...

  7. 利用jenkins+saltstack+sh 修改nginx配置文件并重新加载

    jenkins的配置(这里作用只是当做界面使用,利用它来管理执行salt命令) 1.构建操作来执行shell脚本 (pillar可以配置灵活的参数) saltstack 的 sls文件编写 nginx ...

  8. php 图像处理函数

    gd_info       函数:获取当前安装的GD库的信息 getimagesize  函数:获取图像的大小 image_type_to_extension   函数:获取图像类型的文件后缀 ima ...

  9. php 通过stomp协议连接ActiveMQ

    一.安装php的stomp扩展 http://pecl.php.net/package/stomp 如:stomp-2.0.0.tgz > tar xf stomp-1.0.9.tgz > ...

  10. java类中根据已有的变量复写类的toString方法

    java类中根据已有的变量复写类的toString方法: 在该类中定义好变量之后,shift+alt+s,从出现的列表中点击gemerate toString,就会自动生成对应的toString方法.