有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车;若Pi为一个在车上的奶茶,则把他丢下车;否则,此次操作为捡起最早丢下去的奶茶,若没有符合要求的奶茶则忽略此次操作。对每次操作需要在线询问:操作进行后,不在车上的奶茶的最小编号。m<=1e6,b<=2m,a<=m,数据组数T<=50。

方法一:nlogn暴力,什么树状数组优先队列尽管上。。

方法二:不在车上的最小编号,其实就是还没买的最小和丢下车的最小,还没买的最小可以一个队列搞定,那丢下车的呢?由于先丢下车的会先捡起来,也就是先退出答案考虑的范围,如果某个奶茶又是早丢下车的,编号又不如一个后丢下车的小,那在这个奶茶退出答案前的整个过程他都不会再被当做答案。所以对丢下车的,用一个普通队列记顺序,一个单调队列记答案即可。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
//#include<iostream>
using namespace std; 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;
/*
一开始请调用read(T)读入数据组数T
接下来每组数据开始时请调用init_case(m,a,b,d,p)读入m,a,b,d,p[]
每组数据开始时请用一个初始化为0的32位无符号整形变量ans_sum存储答案,然后对于每个i,
用32位无符号整形变量cur_ans存储第i次答案,并调用update_ans(ans_sum,cur_ans,i)更新。最后输出ans_sum即可。
*/ //示例代码:
int n;
#define maxn 2000011
unsigned int qin[maxn],headin,tailin,qout[maxn],headout,tailout,q[maxn],head,tail;bool buy[maxn],have[maxn];
int main()
{
static int p[];
int T;read(T);
int m,a,b,d;
while(T--)
{
unsigned int ans_sum=,cur_ans=;
init_case(m,a,b,d,p); memset(buy,,sizeof(buy));
memset(have,,sizeof(have));
headin=tailin=headout=tailout=head=tail=;
for (int i=;i<=a;i++) buy[i]=have[i]=;
for (int i=a+;i<=*m;i++) qin[tailin++]=i; for(int i=;i<=m;i++)
{
if (d)
{
if (p[i]==-) cur_ans=;
else if (!buy[p[i]])
{
buy[p[i]]=have[p[i]]=;
while (buy[qin[headin]]) headin++;
cur_ans=qin[headin];
if (headout<tailout) cur_ans=min(cur_ans,qout[headout]);
}
else cur_ans=;
}
//d=1 hai mei pan duan
else if (p[i]<)
{
if (head==tail) cur_ans=;
else
{
have[q[head]]=;
if (qout[headout]==q[head]) headout++;
head++;
cur_ans=qin[headin];
if (headout<tailout) cur_ans=min(cur_ans,qout[headout]);
}
}
else if (!buy[p[i]])
{
buy[p[i]]=have[p[i]]=;
while (buy[qin[headin]]) headin++;
cur_ans=qin[headin];
if (headout<tailout) cur_ans=min(cur_ans,qout[headout]);
}
else if (have[p[i]])
{
have[p[i]]=;
q[tail++]=p[i];
while (headout<tailout && qout[tailout-]>p[i]) tailout--;
qout[tailout++]=p[i];
cur_ans=min(qin[headin],qout[headout]);
}
else
{
if (head==tail) cur_ans=;
else
{
have[q[head]]=;
if (qout[headout]==q[head]) headout++;
head++;
cur_ans=qin[headin];
if (headout<tailout) cur_ans=min(cur_ans,qout[headout]);
}
}
update_ans(ans_sum,cur_ans,i);
}
printf("%u\n",ans_sum);
}
return ;
}

这题的读入有点新颖。。

LOJ#541. 「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」七曜圣贤

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

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

    题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O ...

  5. LOJ#539. 「LibreOJ NOIP Round #1」旅游路线

    n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...

  6. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

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

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

  8. 「LOJ 538」「LibreOJ NOIP Round #1」数列递推

    description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...

  9. 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线

    description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...

随机推荐

  1. 204 Count Primes 计数质数

    计算所有小于非负整数 n 的质数数量. 详见:https://leetcode.com/problems/count-primes/description/ Java实现: 埃拉托斯特尼筛法:从2开始 ...

  2. easy ui diglog 点击关闭,触发事件

    $('#dialogDiv').dialog({ onClose:function(){ alert('11111111') ; }});

  3. JWT认证阐述

    哥发达了,是时候实现一下儿时的梦想了,怡红院开起! 店面门脸装修如何?做生意,谁还没个镇店之宝啊?有请我的店长如花小姐! 没事哈!别怕,扭曲的五官往往都藏着一颗纯洁的心灵. 不管如何吧,我的怡红院算是 ...

  4. H.264学习笔记2——帧内预测

    帧内预测:根据经过反量化和反变换(没有进行去块效应)之后的同一条带内的块进行预测. A.4x4亮度块预测: 用到的像素和预测方向如图: a~f是4x4块中要预测的像素值,A~Q是临块中解码后的参考值. ...

  5. 常用css属性拓展

    text-overflow:clip | ellipsis(默认值:clip)clip:当内联内容溢出块容器时,将溢出部分裁切掉.ellipsis:当内联内容溢出块容器时,将溢出部分替换为(...). ...

  6. 关于mapState和mapMutations和mapGetters 和mapActions辅助函数的用法及作用(二)-----mapMutations

    在组件中提交Mutations: import { mapState, mapMutations } from 'vuex' export default { data() { return { ms ...

  7. 2015年度精品 最新力作32位和64位xp,win7,win8,win10系统下载(电脑城专用版)

    一.系统主要特点 1.安装维护方便快速 - 全自动无人值守安装,采用万能GHOST技术,安装系统过程只需3-5分钟,适 合新旧各种机型. - 集成常见硬件驱动,智能识别+预解压技术,绝大多数硬件可以快 ...

  8. pil - pillow 的版本

    pip install  PIL        python2版本 pip install  pillow      python3版本

  9. windows环境开启PHP fileinfo扩展

    fileinfo作用:本模块中的函数通过在文件的给定位置查找特定的 魔术 字节序列 来猜测文件的内容类型以及编码(通俗来讲就是获取文件的MIME信息) 开启PHP fileinfo扩展的方法: 1.下 ...

  10. windows sdk编程隐藏窗体标题栏

    #include <windows.h> /*消息处理函数声明*/ HRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM ...