有一辆车一开始装了编号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. [转]Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application (3 of 10)

    本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-fi ...

  2. IIS7.0中Process打开cmd程序出现问题

    本人在VS中用Process打开cmd程序,并传入参数,转换图片,运行成功! 但是放入IIS7.0中,Process打不开cmd程序,程序直接运行过去,无结果,无报错! 解决方案: 将IIS里面你程序 ...

  3. c语言-依赖倒转

    当一个文件(aa.c文件)依赖于头文件(bb.h)时,如果bb.c编译之后形成的bb.o文件重新编译后,aa.o的文件不需要重新编译 aa.c文件: bb.h文件:对bb.c文件进行声明 bb.c文件 ...

  4. Kickstart Round D 2017 : A

    思路: 动态规划. large数据的时间范围很大,无法设计入状态中.转换思路为定义dp[i][j]为当前在景点i,并且已经游览了j个景点所花费的最小时间,这种思想与leetcode45类似.于是转移方 ...

  5. [Tunny]CSS LESS框架基础

    [黄映焜/Tunny,20140711] Less 是一个Css 预编译器,意思指的是它可以扩展Css语言,添加功能如允许变量(variables),混合(mixins),函数(functions) ...

  6. 经典算法mark

    在平时找工作的时候,或多或少会遇到一些算法问题,很多都是比较经典或者网上已经流传很久的.只是我们没有接触过,所以不知道怎么解决. 在这儿,我自己总结一些我遇到的一些经典算法,给自己增加一点记忆,也给需 ...

  7. Codeforces_791_B. Bear and Friendship Condition_(dfs)

    B. Bear and Friendship Condition time limit per test 1 second memory limit per test 256 megabytes in ...

  8. Java HTTP 组件库选型看这篇就够了

    最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时.空闲连接数控制.每 ...

  9. 实现UAC对话框效果

    设置桌面全屏: int cxScreen,cyScreen; cxScreen=GetSystemMetrics(SM_CXSCREEN); cyScreen=GetSystemMetrics(SM_ ...

  10. 德尔福 XE5 安卓权限设置

    http://delphi.org/2013/10/delphi-xe5-android-uses-permissions/ The permissions required by a Delphi ...