「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 ...
随机推荐
- adb获取设备的序列号
用数据线连接手机, 打开开发者模式, 并赋予相关权限, 在CMD命令行输入: adb devices 第一个参数即为设备的序列号, 第二个参数device表示设备的状态是在线.
- web自动化测试框架总结
web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09
- tpo-08 C2 A strategy for attracting customers
第 1 段 1.Listen to a conversation between a student and a business professor. 听一段学生和教授的对话. 第 2 段 1.So ...
- 第六章 高级I/O函数
第六章 高级I/O函数 6.1 pipe函数 即管道函数,用于进程间的通信. #include<unistd.h> int pipe(int fd[2]); // fd:filedes / ...
- lintcode101 删除排序数组中的重复数字 II
删除排序数组中的重复数字 II 跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 在:lintcode100删除排序数组中的重复数字 的基础上进行改进. class Solution ...
- [SHELL]退出脚本
一,退出状态码 1,范围:0~255 2,查看退出状态码:必须在命令执行之后立即执行 ,显示的是脚本最后一条命令的退出状态码 echo $? 若f返回值为0,则表示正常 有异常为正值 二,exit 脚 ...
- 函数重载(overload)和函数重写(override)
1. 前言: 在C++中有两个非常容易混淆的概念,分别是函数重载(overload)和函数重写(overwirte).虽然只相差一个字,但是它们两者之间的差别还是非常巨大的. 而通过深入了解这两个概念 ...
- 幸运的袋子(深度优先遍历(Depth First Search,DFS))
题目描述 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的).如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积. 例如:如果袋子里面的球的号码是{1, 1, 2 ...
- Hadoop第二课:Hadoop集群环境配置
一.Yum配置 1.检查Yum是否安装 rpm -qa|grep yum 2.修改yum源,我使用的是163的镜像源(http://mirrors.163.com/),根据自己的系统选择源, #进入目 ...
- 官方文档 恢复备份指南二 Getting Started with RMAN
本章对RMAN进行基本的熟悉和了解 1.Overview of the RMAN Environment RMAN运行时需要的最小环境: target database ...