「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 ...
随机推荐
- 「日常训练」 Yukari's Birthday(ZOJ-3665)
题意与分析 二分题.考虑到n的范围是\(10^{12}\),注意到等比公式\(S=a_1\frac{1-q^n}{1-q} (q\ne 1)\),可以看出,不论q有多大(1除外,这个时候\(r=1,k ...
- Appium1.8及以上命令行启动
安装命令行启动版本的Appium,appium-doctor需要独立下载了,用 npm的话需要FQ才好使,所有安装了cnpm代替npm, cnpm是从淘宝的国内镜像下载 npm config rm p ...
- Linux命令应用大词典-第22章 GRUB
22.1 grub-md5-crypt:使用MD5格式加密口令 22.2 grub-install:在设备上安装GRUB 22.3 grub:进入GRUB命令shell 22.4 grub-crypt ...
- 已有海外版Office365,如何开通相同Tenant的Azure
下面这个步骤是开通海外版Azure的测试账号,请了解! 翻到如图位置 点击免费开始 下一步 输入验证代码,此页没截图 使用信用卡,需要visa或master 下一步认证完就可以使用,没有继续截图
- Eclipse 安装SVN、Maven插件
1先安装subeclipse插件就是svn svn - http://subclipse.tigris.org/update_1.6.x 我这里是灰色的说明我安装过了这里只是截图说明下,我就不继续安装 ...
- POJ 3845 Fractal(计算几何の旋转缩放)
Description Fractals are really cool mathematical objects. They have a lot of interesting properties ...
- Thunder团队第二周 - Scrum会议2
Scrum会议2 小组名称:Thunder 项目名称:爱阅app Scrum Master:胡佑蓉 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- Daily Scrum 11
今天我们小组开会内容分为以下部分: part 1: 针对学长的搜索算法进行优化,每人发表自己的看法; part 2:对积分系统.防滥用.搜索算法优化部分代码任务的讨论和分工: part 3:进行明日的 ...
- 项目UML设计(团队)
[团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...
- 3ds Max学习日记(四)
下午去实验室见了师姐,人还挺好,给我安排了任务,和3ds max没有半毛钱关系. 附上今日的劳动成果: 板子(牌匾) 简约吊灯(看上去比较单调) 高脚杯(喝酒用的) 沙发(沙发) ...