【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤
【题意】一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作:
1.买进编号未在车上出现过的红茶。
2.丢掉车上指定编号的红茶。
3.将最早丢出去的红茶捡回来。
每次操作后求编号最小的不在车上的红茶。
【算法】单调队列
【题解】本题最重要的性质在于早丢早捡。
因此,当进行丢掉编号为x的红茶这一操作时,如果编号>x的红茶早丢,那么也一定早捡,所以这些红茶没有贡献。
所以用单调队列维护所有有效的红茶,那么捡回来的时候判断是否队头,每次答案就是min(队头,maxs+1),maxs是当前已买过的红茶编号。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; namespace IO{int c;unsigned int seed;unsigned int randnum(){seed^=seed<<13;seed^=seed>>17;seed^=seed<<5;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=1;i<=m;i++){if(randnum()%c==0)p[i]=-1;else p[i]=randnum()%b;}}inline void update_ans(unsigned int &ans_sum,unsigned int cur_ans,int no){const static unsigned int mod=998244353;ans_sum^=(long long)no*(no+7)%mod*cur_ans%mod;} } using IO::read; using IO::init_case; using IO::update_ans; const int maxn=2000010; int p[maxn]; bool A[maxn],B[maxn]; int q[maxn],head,tail; queue<int>Q; void ins(int x){while(head<tail&&q[tail-1]>x)tail--;q[tail++]=x; } int main(){int T;read(T);int m,a,b,d;while(T--){unsigned int ans_sum=0,cur_ans=0;init_case(m,a,b,d,p);memset(A,0,sizeof(A));memset(B,0,sizeof(B));head=0;tail=0;for(int i=0;i<=a;i++)A[i]=B[i]=1;while(!Q.empty())Q.pop();int ans=a+1,maxs=a;for(int i=1;i<=m;i++){bool ok=1;if(p[i]==-1){if(Q.empty()||d)ok=0;else{int x=Q.front();A[x]=1;Q.pop();if(head<tail&&q[head]==x)head++;if(head<tail)ans=min(maxs+1,q[head]);else ans=maxs+1;}}else if(!B[p[i]]){A[p[i]]=B[p[i]]=1;while(B[maxs+1]){if(ans==maxs+1)ans++;maxs++;}if(head<tail&&maxs+1>=q[head])ans=q[head];}else if(A[p[i]]){if(d)ok=0;else{Q.push(p[i]);A[p[i]]=0;ins(p[i]);ans=min(ans,q[head]);}}else{if(Q.empty()||d)ok=0;else{int x=Q.front();A[x]=1;Q.pop();if(head<tail&&q[head]==x)head++;if(head<tail)ans=min(maxs+1,q[head]);else ans=maxs+1;}}if(!ok)cur_ans=0;else cur_ans=ans;update_ans(ans_sum,cur_ans,i);}printf("%u\n",ans_sum);}return 0; }
View Code
转载于:https://www.cnblogs.com/onioncyc/p/7791471.html
【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤相关推荐
- LibreOJ NOIP Round #1」七曜圣贤
B. 七曜圣贤 内存限制:1024 MiB时间限制:2500 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 本题 C/C++ 时限 2.5 秒,Pascal 时限 5 秒.最后将改时限 ...
- 「LibreOJ NOIP Round #1」旅游路线
「LibreOJ NOIP Round #1」旅游路线 题目链接 做法: 首先肯定要预处理些东西,来使单词询问达到\(o(logn)\)或者\(o(1)\)的复杂度,又因为距离这个东西的范围太大,我们 ...
- LOJ#538. 「LibreOJ NOIP Round #1」数列递推
description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从000开始,无限长的整数列ai{a_{i ...
- LOJ#539. 「LibreOJ NOIP Round #1」旅游路线
n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...
- libreoj #514. 「LibreOJ β Round #2」模拟只会猜题意
给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r)=\sum_{i=l}^{r} A_{i}f(l,r)=∑i=lrAi. 询问 mmm 次,每次 ...
- [匹配+拓扑] LibreOJ #521. 「LibreOJ β Round #3」绯色 IOI(抵达)
题意 戳这里 题解 这题一开始感觉无从下手,所以我们要尝试得到一些结论. 自己画一画可以发现,一定是两两互为对方的庇护所.这样才有可能保证任意两个不同的城市庇护所不同.否则由于原图没有环,到后面必定会 ...
- [结论] LibreOJ #520. 「LibreOJ β Round #3」绯色 IOI(开端)
题意 戳这里 题解 这是一道结论题. 我们先把数放到数轴上考虑.定义两个点的距离为几何上的距离的平方. 我们可以把一个回路看作两条从 11 到 nn 的不相交的路径. 有一种经典的二路取数的 O(n2 ...
- [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp
「LibreOJ NOIP Round #1」旅游路线 题目链接:https://loj.ac/problem/539 题解: 这个题就很神奇 首先大力$dp$很好想,因为可以把一维放到状态里以取消后 ...
- 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
#572. 「LibreOJ Round #11」Misaka Network 与求和 推式子 ∑i=1n∑j=1nf(gcd(i,j))k∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j ...
最新文章
- 高性能Sqlite存储模型对象解密
- Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App
- 【过程改进】 windows下jenkins常见问题填坑
- mysql 备份文件太大_mysql数据库太大了怎么备份
- 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
- 从头学习计算机网络_如何从头开始构建三层神经网络
- day34 数据库入门
- Java加密与解密的艺术~数字签名~ECDSA实现
- vijos 1071 01背包+输出路径
- Service Mesh服务网格:8种方式简化微服务部署
- vrpie在Visio Studio 中无法调试的问题
- 一步一步学Ruby(五): Class, Module, Object,Kernel的关系
- 使用Popup窗口创建无限级Web页菜单(4)
- 什么时候用DFS,什么时候用BFS?(DFS和BFS的特点和异同)
- 计算机中的PS颜色填充快捷键,ps中填充颜色的快捷键是什么(填充Shift+F5)
- IDEA 中添加@author注释(live templates)
- AI作画的人机战争走向何方?
- 开题报告:基于java新冠疫苗在线预约系统 毕业设计论文开题报告模板
- NLP 中文分词-双向匹配算法(理论+Python实现)
- 关于计算机的英语作文带翻译100字,求30篇100字英语作文带翻译