题目啰嗦:
支持三个操作:

不可重复集合:
1.加入一个数

2.删除一个数

3.恢复目前最早的一次删除的数

操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数)

50组数据+1e6,必须O(N)

维护删除、恢复的数的操作可以队列维护。

数有没有在集合里可以全局bool数组记录

加入删除一个数,mex怎么维护?

考虑化简问题:
只插入?

直接mex往上走到第一个没有出现的数即可。单增,O(N)

有删除?

如果删除小的一个数,mex要跳下来,然后再恢复这个删除的数,mex又得一步一步走上去。

能不能不跳?

可以!

只要知道当前删除的数最小的一个,和mex取min即可。

维护删除的数的集合:

插入一个数,删除一个数,维护最小的数。怎么看也得带logn

但是,发现恢复数是按照时间顺序从小到大

所以一个数如果比后面的数大,那么直到这个删除的数被恢复也不可能成为最小值。

单调队列维护。

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define numb (ch^'0')
  5. using namespace std;
  6. typedef long long ll;
  7. il void rd(int &x){
  8. char ch;x=;bool fl=false;
  9. while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  10. for(x=numb;isdigit(ch=getchar());x=x*+numb);
  11. (fl==true)&&(x=-x);
  12. }
  13. namespace Miracle{
  14. const int N=1e6+;
  15. const int mod=;
  16. int ans[N];
  17. int q[*N],l,r;
  18. queue<int>que;
  19. int p[N];
  20. bool on[*N],has[*N];
  21. namespace IO{
  22. int c;
  23. unsigned int seed;
  24. unsigned int randnum(){
  25. seed^=seed<<;
  26. seed^=seed>>;
  27. seed^=seed<<;
  28. return seed;
  29. }
  30.  
  31. inline int read(int &x){scanf("%d",&x);return x;}
  32. inline void init_case(int &m,int &a,int &b,int &d,int p[]){
  33. scanf("%d%u%d%d%d%d",&m,&seed,&a,&b,&c,&d);
  34. for(int i=;i<=m;i++){
  35. if(randnum()%c==)p[i]=-;
  36. else p[i]=randnum()%b;
  37. }
  38. }
  39.  
  40. inline void update_ans(unsigned int &ans_sum,unsigned int cur_ans,int no){
  41. const static unsigned int mod=;
  42. ans_sum^=(long long)no*(no+)%mod*cur_ans%mod;
  43. }
  44. }
  45. using IO::read;
  46. using IO::init_case;
  47. using IO::update_ans;
  48. void clear(){
  49. memset(on,,sizeof on);
  50. memset(q,,sizeof q);
  51. l=,r=;
  52. memset(has,,sizeof has);
  53. while(!que.empty()) que.pop();
  54. }
  55. int get(){
  56. while(l<=r&&on[q[l]]) ++l;
  57. if(l<=r) return q[l];
  58. return 0x3f3f3f3f;
  59. }
  60. void upda(int c){
  61. while(l<=r&&q[r]>=c) --r;
  62. q[++r]=c;
  63. }
  64. int main(){
  65. int T;read(T);
  66. int m,a,b,d;
  67. while(T--){
  68. clear();
  69. init_case(m,a,b,d,p);
  70.  
  71. for(reg i=;i<=a;++i) on[i]=,has[i]=;
  72. int mex=a+;
  73. for(reg i=;i<=m;++i){
  74. int k;
  75. if(p[i]==-){//case 3
  76. if(que.empty()||d){
  77. ans[i]=;goto end;
  78. }else{
  79. k=que.front();que.pop();
  80. on[k]=;
  81. }
  82. }else{
  83. if(!on[p[i]]&&!has[p[i]]){
  84. has[p[i]]=;
  85. on[p[i]]=;
  86. }else if(on[p[i]]){
  87. if(d==){
  88. ans[i]=;goto end;
  89. }else{
  90. que.push(p[i]);
  91. on[p[i]]=;
  92. upda(p[i]);
  93. }
  94. }else{
  95. if(que.empty()||d){
  96. ans[i]=;goto end;
  97. }else{
  98. k=que.front();que.pop();
  99. on[k]=;
  100. }
  101. }
  102. }
  103. while(on[mex]) ++mex;
  104. ans[i]=min(mex,get());
  105. end:;
  106. }
  107. ll op=;
  108. for(reg i=;i<=m;++i){
  109. op^=(ll)ans[i]*((ll)i*i%mod+*i%mod)%mod;
  110. }
  111. printf("%lld\n",op);
  112. }
  113. return ;
  114. }
  115. }
  116. signed main(){
  117. Miracle::main();
  118. return ;
  119. }
  120.  
  121. /*
  122. Author: *Miracle*
  123. Date: 2018/12/31 16:28:17
  124. */

「LibreOJ NOIP Round #1」七曜圣贤的更多相关文章

  1. LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)

    被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的.... 显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T #includ ...

  2. 【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤

    [题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求 ...

  3. LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤

    有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...

  4. 「LOJ 541」「LibreOJ NOIP Round #1」七曜圣贤

    description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问 ...

  5. 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推

    [题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...

  6. 题解【loj537】「LibreOJ NOIP Round #1」DNA 序列

    题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关 ...

  7. 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列

    description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...

  8. 「LibreOJ NOIP Round #1」旅游路线

    Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...

  9. LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)

    哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...

随机推荐

  1. 怎样下载Firefox与Chrome浏览器驱动

    在浏览器地址栏输入https://www.seleniumhq.org/ 打开Selenium官网 下载Firefox浏览器驱动 解压到本地 下载Chrome浏览器驱动 解压到本地 把这2个驱动放到P ...

  2. Jmeter登录接口返回 status415

    1.现象:在查看结果树中看到: Request Headers:Connection: keep-aliveContent-Type: application/x-www-form-urlencode ...

  3. 第五模块·WEB开发基础-第2章JavaScript基础

    第1章 JavaScript基础 01-JavaScript历史介绍 02-JavaScript的组成 03-JavaScript的引入方式 04-变量的使用 05-基本数据类型(一) 06-基本数据 ...

  4. 阿里云ECS下CentOS7.4 yum安装Python3.6环境

    一.安装EPEL和IUS软件源 二.安装Python3.6 三.创建python3软链接连接符 四.安装pip3 五.创建pip3链接符 六.进行验证是否安装成功 一.安装EPEL和IUS软件源 yu ...

  5. Python零基础入门必知

    Python自学知识点总结 //2018.10.09 1. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido ...

  6. 【转】UTF8字符串转换为汉字 c#,转自游戏开发主席

    using System; /// <summary> /// UTF8字符串转换为汉字用的类 /// 转换如"\\u8d35"之类的字符串为对应的汉字 /// < ...

  7. Solium代码测试框架

    Solium, 在solid中,Linter用于标识和修复样式&安全问题 //调用测试 solium -d contracts --fix 源代码名称:Solium 源代码网址:http:// ...

  8. Hadoop源码解析 1 --- Hadoop工程包架构解析

    1 Hadoop中各工程包依赖简述     Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.     GoogleCluster: http:// ...

  9. 七:Web Application Proxy

    yarn自带了web接口,默认是和RM一起的(8088端口).但是为了减少从web接口受到的攻击,可以把Web接口单独放在别的机器上. 设置下web代理就行了 Configurations Confi ...

  10. jquery delayLoading.js插件的延迟加载效果和图片延迟加载

    1.首页给大家介绍一下这款插件的主要用途 主要应用于图片的延迟加载,而且可以变换不同的延迟加载效果,适合相册图片.有做相册的可以考虑应用. 2.兼容IE7以上都兼容,其他的浏览器也兼容.所以说兼容性还 ...