「LibreOJ NOIP Round #1」七曜圣贤
题目啰嗦:
支持三个操作:
不可重复集合:
1.加入一个数
2.删除一个数
3.恢复目前最早的一次删除的数
操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数)
50组数据+1e6,必须O(N)
维护删除、恢复的数的操作可以队列维护。
数有没有在集合里可以全局bool数组记录
加入删除一个数,mex怎么维护?
考虑化简问题:
只插入?
直接mex往上走到第一个没有出现的数即可。单增,O(N)
有删除?
如果删除小的一个数,mex要跳下来,然后再恢复这个删除的数,mex又得一步一步走上去。
能不能不跳?
可以!
只要知道当前删除的数最小的一个,和mex取min即可。
维护删除的数的集合:
插入一个数,删除一个数,维护最小的数。怎么看也得带logn
但是,发现恢复数是按照时间顺序从小到大
所以一个数如果比后面的数大,那么直到这个删除的数被恢复也不可能成为最小值。
单调队列维护。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+;
const int mod=;
int ans[N];
int q[*N],l,r;
queue<int>que;
int p[N];
bool on[*N],has[*N];
namespace IO{
int c;
unsigned int seed;
unsigned int randnum(){
seed^=seed<<;
seed^=seed>>;
seed^=seed<<;
return seed;
} inline int read(int &x){scanf("%d",&x);return x;}
inline void init_case(int &m,int &a,int &b,int &d,int p[]){
scanf("%d%u%d%d%d%d",&m,&seed,&a,&b,&c,&d);
for(int i=;i<=m;i++){
if(randnum()%c==)p[i]=-;
else p[i]=randnum()%b;
}
} inline void update_ans(unsigned int &ans_sum,unsigned int cur_ans,int no){
const static unsigned int mod=;
ans_sum^=(long long)no*(no+)%mod*cur_ans%mod;
}
}
using IO::read;
using IO::init_case;
using IO::update_ans;
void clear(){
memset(on,,sizeof on);
memset(q,,sizeof q);
l=,r=;
memset(has,,sizeof has);
while(!que.empty()) que.pop();
}
int get(){
while(l<=r&&on[q[l]]) ++l;
if(l<=r) return q[l];
return 0x3f3f3f3f;
}
void upda(int c){
while(l<=r&&q[r]>=c) --r;
q[++r]=c;
}
int main(){
int T;read(T);
int m,a,b,d;
while(T--){
clear();
init_case(m,a,b,d,p); for(reg i=;i<=a;++i) on[i]=,has[i]=;
int mex=a+;
for(reg i=;i<=m;++i){
int k;
if(p[i]==-){//case 3
if(que.empty()||d){
ans[i]=;goto end;
}else{
k=que.front();que.pop();
on[k]=;
}
}else{
if(!on[p[i]]&&!has[p[i]]){
has[p[i]]=;
on[p[i]]=;
}else if(on[p[i]]){
if(d==){
ans[i]=;goto end;
}else{
que.push(p[i]);
on[p[i]]=;
upda(p[i]);
}
}else{
if(que.empty()||d){
ans[i]=;goto end;
}else{
k=que.front();que.pop();
on[k]=;
}
}
}
while(on[mex]) ++mex;
ans[i]=min(mex,get());
end:;
}
ll op=;
for(reg i=;i<=m;++i){
op^=(ll)ans[i]*((ll)i*i%mod+*i%mod)%mod;
}
printf("%lld\n",op);
}
return ;
}
}
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/31 16:28:17
*/
「LibreOJ NOIP Round #1」七曜圣贤的更多相关文章
- LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)
被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的.... 显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T #includ ...
- 【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤
[题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求 ...
- LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤
有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...
- 「LOJ 541」「LibreOJ NOIP Round #1」七曜圣贤
description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问 ...
- 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...
- 题解【loj537】「LibreOJ NOIP Round #1」DNA 序列
题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关 ...
- 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列
description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...
随机推荐
- 跟浩哥学自动化测试Selenium -- 浏览器的基本操作与元素定位(3)
浏览器的基本操作与元素定位 通过上一章学习,我们已经学会了如何设置驱动路径,如何创建浏览器对象,如何打开一个网站,接下来我们要进行一些复杂的操作比如先打开百度首页,在打开博客园,网页后退,前进等等,甚 ...
- vuex -- vue的状态管理模式
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大 ...
- 几个常见移动平台浏览器的User-Agent
之前介绍的手机站跳转url的一片文稿中提到,依据User Agent判断终端的方法.(文章地址:http://www.cnblogs.com/dereksunok/p/3664169.html ) 若 ...
- nodejs笔记--Events篇(二)
常用事件 /* 调用events模块,获取events.EventEmitter对象 */ var EventEmitter = require('events').EventEmitter; var ...
- Python中的print
Python 3.X的print 在Python 3.X中,print是一个内置函数,完整的声明形式如下: print([object, ...][, sep=' '][, end='\n'][, f ...
- 对Android体系结构的理解--后续会补充
1.最底层_硬件 任何Android设备最底层的硬件包括 显示屏, wifi ,存储设备 等. Android最底层的硬件会根据需要进行裁剪,选择自己需要的硬件. 2.Linux内核层 该层主要对硬件 ...
- C语言特殊符号
-> ->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”.用法:p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员.表达式p->a引用了 ...
- lintcode-34-N皇后问题 II
34-N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 标签 递归 思路 参考http://www.cnblogs.com ...
- JS DOM视频相关的知识
1.实现点击a标签改变图片时,如果a的href属性有一个目标网址,但是点击又必须跳转到另外一张图,往往会最后跳转到目标网址,可以在onclick事件函数中加入ruturn false,阻止跳转到页面. ...
- 不同品牌交换机设置telnet方法
H3C交换机:1.设置telnet system-view super password level 3 cipher ******telnet server enable user-interfac ...