题目大意

  有一个双端队列,每个元素是一个物品,每个物品有体积和价值两个属性。

  有 \(n\) 个操作,分为 \(5\) 种:前后端插入删除,还有询问:选出一些物品,满足这些物品的体积之和模 \(p\) 在 \([l,r]\) 之间,问你价值和最大是多少。

  \(n\leq 50000,p\leq 500\)

题解

离线做法

  处理出每个物品加入队列的时间和删除的时间,插入到线段树里面分治就好了。

  时间复杂度:\(O(np\log n)\)

在线做法

  考虑对于一个队列,从中间向两边各建一个可持久化栈维护两边中间到两边的物品加在一起的信息。

  如果删除后把某一个栈的栈底删掉了,就从中间开始重构这两个栈。

  对于一个询问,枚举左边的物品体积是多少,然后右边的物品体积就是一个区间。

  可以按照 \(r-l+1\) 分块,这样每次询问就是块内的一个前缀和一个后缀。

  时间复杂度:\(O(np)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGEchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUGchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const int N=50010;
const int P=510;
const ll inf=0x3fffffffffffffffll;
struct info
{ll a[P];ll &operator [](int x){return a[x];}void clear(){memset(a,0xc0,sizeof a);a[0]=0;}
};
int n,p;
info a1[N],a2[N];
int l,r,mid;
int t1,t2;
int w[2*N],v[2*N];
void init()
{l=50001;r=50000;mid=50000;a1[0].clear();a2[0].clear();
}
void addl(int x)
{t1++;a1[t1]=a1[t1-1];for(int i=0;i<p;i++)a1[t1][(i+w[x])%p]=max(a1[t1][(i+w[x])%p],a1[t1-1][i]+v[x]);
}
void addr(int x)
{t2++;a2[t2]=a2[t2-1];for(int i=0;i<p;i++)a2[t2][(i+w[x])%p]=max(a2[t2][(i+w[x])%p],a2[t2-1][i]+v[x]);
}
void rebuild()
{mid=(l+r)>>1;t1=0;t2=0;for(int i=mid;i>=l;i--)addl(i);for(int i=mid+1;i<=r;i++)addr(i);
}
int pre[P],suf[P];
void query()
{int ql,qr;scanf("%d%d",&ql,&qr);int len=qr-ql+1;ll s=-inf;for(int i=0;i<p;i++){if(i%len==0)s=-inf;s=max(s,a1[t1][i]);pre[i]=s;}s=-inf;for(int i=p-1;i>=0;i--){if(i%len==len-1)s=-inf;s=max(s,a1[t1][i]);suf[i]=s;}ll ans=-1;
//  for(int i=0;i<p;i++)
//      for(int j=0;j<p;j++)
//          if((i+j)%p>=ql&&(i+j)%p<=qr)
//          {
//              ans=max(ans,a1[t1][i]+a2[t2][j]);
//              if(ans==481594)
//                  int xxx=1;
//          }for(int i=0;i<p;i++){int _l=ql-i;int _r=qr-i;if(_l<0)_l+=p;if(_r<0)_r+=p;ans=max(ans,a2[t2][i]+max(pre[_r],suf[_l]));int z=p/len*len;if(_l>_r&&_l<z)ans=max(ans,a2[t2][i]+suf[z]);}printf("%lld\n",ans);
}
char op[10];
void gao()
{scanf("%s",op);if(op[0]=='I'){if(op[1]=='F'){l--;scanf("%d%d",&w[l],&v[l]);w[l]%=p;addl(l);}else{r++;scanf("%d%d",&w[r],&v[r]);w[r]%=p;addr(r);}}else if(op[0]=='D'){if(op[1]=='F'){l++;t1--;if(l>mid+1)rebuild();}else{r--;t2--;if(r<=mid+1)rebuild();}}else{query();}
}
int main()
{open("loj6515");rd();scanf("%d%d",&n,&p);init();for(int i=1;i<=n;i++){if(i==75)int xxx=1;gao();
//      if(op[0]=='Q')
//          printf("%d\n",i);}return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/9846430.html

【LOJ6515】贪玩蓝月相关推荐

  1. [LOJ6515]贪玩蓝月

    题目 传送门 to LOJ 思路 我吐了--我直接分块然后复杂度算错了--

  2. 《贪玩蓝月》年入10亿?背后的玩法也太“流氓”了

    本文来源:运营研究社 ID:U_quan 作者:仵静文 说到贪玩蓝月,相信大家第一个想到的一定是这段魔性的广告: 大嘎好,我系轱天乐,我四渣渣辉,探挽懒月,介四里没有挽过的船新版本,只需体验三番钟,里 ...

  3. 是兄弟就来砍我!“贪玩蓝月”母公司实控人被捕:曾是中国最年轻富豪

    "大扎好,我系渣渣辉,探挽懒月,介四里没有挽过的船新版本,挤需体验三番钟,里造会干我一样,爱象节款游戏." 图片来源于网络 虽然没有玩过"贪玩蓝月",但你一定听 ...

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

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

  5. 鸿蒙之隙 可以参加几次,贪玩蓝月封魔谷活动攻略 每天可以参加几次

    贪玩蓝月贪玩蓝月中角色如何快速升级一直是玩家们很头痛的问题,今天小编来给大家介绍一种常见的快速升级方法日常活动中的封魔谷活动~ 贪玩蓝月中封魔谷活动是一个角色快速获得经验的途径,任务入口位于盟重省NP ...

  6. APP应用加固实战案例:贪玩蓝月

    "我是渣渣辉,是兄弟就砍我!" 众所周知,<贪玩蓝月>是一款网页游戏,自2016年发行以来,其代言人也是大咖云集,除了古天乐外,山鸡哥陈小春.刘烨.张家辉.古力娜扎.冯 ...

  7. 贪玩蓝月服务器维护需多少时间,贪玩蓝月一般多久合区 | 手游网游页游攻略大全...

    发布时间:2018-01-26 在游戏中能增加战力的地方是那些系统呢?现在就为各位玩家来介绍如何提升战力,我们分为三个不同类型的玩家来详细为大家如何去提升战力-- 平民玩家 :相信平民玩家,也冲的起首 ...

  8. 贪玩蓝月服务器维护需多少时间,贪玩蓝月合区维护一次多久 | 手游网游页游攻略大全...

    发布时间:2018-01-26 在游戏中能增加战力的地方是那些系统呢?现在就为各位玩家来介绍如何提升战力,我们分为三个不同类型的玩家来详细为大家如何去提升战力-- 平民玩家 :相信平民玩家,也冲的起首 ...

  9. #4306. 贪玩蓝月

    题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 www 和一个战斗力 vvv .在每种特定的情况下,你都要选出特征值的和对 ppp 取模后 ...

  10. 贪玩蓝月怎么赚人民币 回收RMB是否真实?

    贪玩蓝月传奇是一款多人在线的大型即时制角色扮演类网页游戏,小伙伴们肯定是知道这款游戏的,有多个明星给这个游戏做过代言,其中的广告说是一款可以回收RMB的游戏,那么是不是像广告讲的那样呢?除了蓝月传奇外 ...

最新文章

  1. 获取bing带swim的网址列表
  2. html5字体颜色自动转换,【转】js里alert里的字体颜色怎么设置:字体颜色方法;fontcolor(color)...
  3. Javascript基础系列之(三)数据类型 (数值 Number)
  4. 截取字符串指定内容,并用*号代替
  5. 八、深入JavaScript的条件语句和循环语句(四)
  6. Leet Code之Number of 1 bits
  7. 大学生应当趁早谋划未来(二)--给表弟的建议
  8. Java实现ActiveMQ之主题的生产者和消费者(二)
  9. DC概论三之setup time 与 hold time 之二
  10. 显示器刷新率测试软件144,【显示器】为什么“吃鸡”要选144Hz显示器?详解高刷新率显示器对FPS游戏的重要影响...
  11. 【Unity3D插件】XCharts插件分享《图表插件》
  12. 安装KeMotion3 03.16d时遇到的问题
  13. Linux 服务器进行安全加固,防止黑客攻击
  14. 涉及到的非线性滤波算法 -- 理解
  15. mysql限制小数位_mysql-控制小数位数
  16. 从破解运动世界校园学习模拟器检测与Xposed检测
  17. iOS开发 - 仿京东添加收货地址效果
  18. Ocr 图文识别技术——基于百度云OCR技术学习与总结
  19. Apache Karaf 存在远程代码执行漏洞
  20. 2021重庆市高考成绩排名查询,重庆2021高考成绩排名榜单,重庆各高中高考成绩喜报...

热门文章

  1. UNIX 进程揭秘--进程的生命周期
  2. 破解Excel的宏密码
  3. halcon裁剪图像_【Halcon】Halcon学习之七:改变图像的现实方式和大小
  4. CloudFoundry 环境上的 Java 应用开发如何指定 build pack
  5. 心法利器[53] | 数据增强的现实应用思考
  6. web项目bug总结
  7. 阿里实习总结(近期)
  8. ELK:Logstash 字段名称大小写切换
  9. visual studio设置字体及护眼背景色
  10. 小程序复用公众号资质快速认证