【BZOJ5286】[HNOI2018]转盘(线段树)
【BZOJ5286】[HNOI2018]转盘(线段树)
题面
题解
很妙的一道题目啊。(全世界除了我这题都有40分,就我是一个状压选手
首先来发现一些性质,我们走一圈一定不会更差。
为啥呢?我们反过来看,我们可以钦定一个时间\(T\),然后从这个时刻出发,每个时刻可以向前走一步或者停留于此,而每个物品有一个消失时间,过了这个时间你还没有到这个位置你就凉了。
那么我们发现我们显然只需要走一圈就可以拿到所有的东西,如果走一圈还有东西拿不到那你走再多圈也拿不到。
那么现在我们要做的就是让钦定的时间\(T\)最短,那么我们又发现了,你显然不会停,停下来显然不优,因为我们现在要做的就是走一圈,既然所有东西都会消失,那么停下来干啥啊。
行,那么我们再正回来,也就是两个性质:只要我们开始走了,我们就不会停,要停也只会在起点停留若干时间之后一直向前走。另外一个是,我们只会走一圈,走回起点的前一个格子就结束了。
所以,不难发现我们的答案就是停留时间加上\(n-1\)。
考虑为啥要停留,证明有一个物品出现的时间很晚,我们必须要在所有物品出现以后才能拿。
那么这个出发时间是什么呢?假设物品的位置是\(j\),出发点是\(i\),\(j\ge i\),物品出现的时间是\(t\)。假设我们等待的时间是\(x\)。那么显然\(x+j-i\ge t_j\),移项可以得到\(x\ge t_j-j+i\),也就是\(x=max(j-i+t_j)\),写得好看点就是\(x=max(t_j-j+i)\)。
那么我们要求的答案就是\((n-1)+min_{i=1}^nmax_{j=i}^{n+n}t_j-j+i\)
为什么要到\(n+n\)我们破环成链之后再原数组后面再接了一份。至于为什么不是到\(i+n\)是因为\(i+n+1\)到\(n+n\)这一段一定不会出现最大值。
现在考虑这个东西怎么维护就好了。
不难发现可能的最大值一定是一个关于\(t_j-j\)的单调栈。维护单调栈可以参考楼房重建那题。
大致的做法是,令\(mx\)表示区间的\(t_j-j\)的最大值。\(ans\)表示区间的答案。
考虑如何合并两个区间,这个东西是一个后缀区间的单调栈,所有右区间的值是直接拿过来用的。
考虑左区间接过来的答案,我们记录当前的右区间的最值,在左区间上面进行二分,找到最后一个大于最值的位置,那么单调栈我们就一直了,那么答案只需要沿着二分区间一路取\(max\)就可以了。
时间复杂度两个\(log\)。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 200200
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,typ,T[MAX],lans;
int t[MAX<<2],mx[MAX<<2];
int Query(int now,int l,int r,int x)
{
if(l==r)return l+max(x,mx[now]);
int mid=(l+r)>>1;
if(mx[rson]>=x)return min(t[now],Query(rson,mid+1,r,x));
return min(Query(lson,l,mid,x),mid+1+x);
}
void pushup(int now,int l,int r)
{
int mid=(l+r)>>1;
t[now]=Query(lson,l,mid,mx[rson]);
mx[now]=max(mx[lson],mx[rson]);
}
void Build(int now,int l,int r)
{
if(l==r){t[now]=T[l];mx[now]=T[l]-l;return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
pushup(now,l,r);
}
void Modify(int now,int l,int r,int p)
{
if(l==r){t[now]=T[l];mx[now]=T[l]-l;return;}
int mid=(l+r)>>1;
if(p<=mid)Modify(lson,l,mid,p);
else Modify(rson,mid+1,r,p);
pushup(now,l,r);
}
int main()
{
n=read();m=read();typ=read();
for(int i=1;i<=n;++i)T[i]=T[i+n]=read();
Build(1,1,n+n);printf("%d\n",lans=t[1]+n-1);
while(m--)
{
int x=read(),y=read();if(typ)x^=lans,y^=lans;
T[x]=T[x+n]=y;Modify(1,1,n+n,x);Modify(1,1,n+n,x+n);
printf("%d\n",lans=t[1]+n-1);
}
return 0;
}
【BZOJ5286】[HNOI2018]转盘(线段树)的更多相关文章
- BZOJ5286: [Hnoi2018]转盘 (线段树)
题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- [HNOI/AHOI2018]转盘(线段树优化单调)
gugu bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- bzoj5286 [Hnoi2018]转盘
题目描述: bz luogu 题解: 看了半个晚上终于明白了. 首先最优决策一定有:在起始点停留一段时间然后一直前进. 解释网上有很多,在这里不赘述了. (由于是环,先把$T$数组倍长.) 首先基于决 ...
- [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 15 Solved: 11[Submit][Status][Di ...
- BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)
显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...
- [HNOI2018]转盘[结论+线段树]
题意 题目链接 分析 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明: 如果要停留的话一定在出发点停留,这样后面的位置更容易取到. 走超过两圈的情况都可以 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
随机推荐
- 清除EasyUi combotree下拉树的值
由于测试自带的$(“node”).combotree("clear');问题始终解决不了 最终方法: Hdata是JSON数据源, 在它动态加在成功之后(节点全部显示出来,并且可以选择)再清 ...
- git push上传代码到gitlab上,报错401/403(或需要输入用户名和密码)
之前部署的gitlab,采用ssh方式连接gitlab,在客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全. 后来应开发同事 ...
- Shell学习笔记二
一.调试脚本 调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息.调试信息可以帮你弄清楚是什么原因使得程序发生崩溃或行为异常.每位系统程序员都应该了解 ...
- BAT大厂面试流程剖析
在当今互联网中,虽然互联网行业从业者众多,不断崛起的互联网公司也会很多,但如BAT等大厂,仍然是很多同学想要进入的企业.那么本篇文章将会为大家很直白的讲解大厂的面试流程以及侧重点. 首先闲聊一下,为什 ...
- bootmgr is conmpressed联想Z485
昨天清理磁盘空间的时候,手贱把驱动器给压缩了.再开机的时候就遇到了bootmgr is conmpressed. 我把解决办法发布到百度经验上了 http://jingyan.baidu.com/ar ...
- 研究C语言的新型编译环境TCC
C语言综合研究1 搭建一个tcc环境 研究过程: 问题引出:为什么要使用tcc环境,甚至连图形界面都没有,为什么要使用这样的化境? 按照我们学习的本质来讲,可能是为了体验C语言底层的相关特性,但是在研 ...
- 腾讯QQ的商业模式
近期听到许多关于腾讯QQ的报道,然后想到之前自己在QQ上遇到的一些问题,一瞬间感觉大脑的所有想法喷涌而出. 以前总觉得QQ是个很好的平台,我们可以通过QQ和自己的亲人朋友爱人聊天,有时候还可以在自己的 ...
- 【个人阅读作业】软件工程M1/M2总结
链接:”看<快速软件开发>的五个问题“ http://www.cnblogs.com/leiyy/p/4027759.html 一.较为明白的问题 1. 在文章的第一个关于Square_T ...
- "Linux内核分析"第七周
可执行程序的装载 张文俊+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.预 ...
- CSS编码规则
/* 和HTML一样使用两个空格来代替制表符 */ div { /* 为了代码的易读性,在每个声明块的左花括号前添加一个空格 */' padding: 15px; /* 每个声明语句的:后应该插入一个 ...