洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈
解题报告:
1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,,
给定一个n元环
可以从0时刻开始从任一位置出发
每次可以选择向前走一步或者在原地不动
当到第i个点的时间ti>=Ti的时候点i被标记
问标记完整个环最少要多久时间
(Ti带修改QAQ
首先有几个会用到的性质大概港下
1)只要走一圈就足够
试证如下:
可以考虑反过来看这个问题,若现在已知标记的最后一个点的时间为Tim,那么题目就变成辣,现在时间为T,每次可以向后倒退一步或不动,每个点有一个消失时间Ti,必须要在消失时间之前到达这个点
那么显然只要走一圈就足够
(其实直接感性理解一下就好昂,,,显然再走一圈不会更好,,,有什么可证的QAQ
2)肯定选择向前走,在原地是不可能的
不需要证,随便说下趴(其实一样感性理解就很显然昂,,,?
依然反着考虑,现在变成要求Timmin对趴,然后还要在Ti之前到达对趴,那显然肯定一直跑下去昂为什么要停下来,,,所以我jio得我还是在感性理解并麻油理性解释,,,不管了不管了反正就感性理解一下就好辣QAQ
然后通过这两个性质我们就可以得到最优解一定是什么样儿的:
1)只走一圈
2)中途不会停留,就算停留也是在开始停一段时间
(就是说如果在Tim那儿倒叙做的时候发现最后到了起始节点的时候Tim还是有值的那么就要在最初停Tim的时间
综上,可以得到式子Tim=在第一个节点停留的时间Time+n-1
再思考,Time怎么算?想到Time必然满足Time+dis(i,j)>=tj,变形得Time>=tj-j+i,即Time=max(tj-j+i)
然后现在是找一个i使得max(tj-j+i)min
考虑到ti和i都只和i有关且都是定值,设ai表示ti-i
然后就变成了求min(max(aj)+i),其中j<=2*n(本来是j<=i+n嘛,但考虑到j∈[i+n+1,2n]的时候是不可能有贡献的,所以可以扩大范围麻油影响
然后只看这个max(aj)的话就是个后缀最大值,显然能构成一个单调栈
然后对于这个i,其实可以发现,aj是对应的一个区间嘛,那既然要min所以就i是这个区间的左端点,也就是说会是一个定值
所以如果考虑麻油修改的话就是从后往前维护一个单调栈
有修改就用线段树维护一下就好,实现比较简单,具体可以看楼房重建这道题,都差不多,依然是求mx,然后lth变成了存最左端点的区间的答案而已,实现方法以及思想什么的还是比较一致的w
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define rp(i,x,y) for(rg int i=x;i<=y;++i) const int N=1e5+,inf=0x7fffffff;
int n,m,op,val[N<<],as;
struct sgtr{int l,r,mx,as;}tr[N<<]; il int read()
{
char ch=gc;int x=;bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int query(int x,int dat)
{
// printf("1.as=%d\n",tr[1].as);
// printf("query : x=%d dat=%d l=%d r=%d\n\n",x,dat,tr[x].l,tr[x].r);
if(tr[x].l==tr[x].r)return tr[x].l+dat+;
if(tr[rs(x)].mx<=dat)return query(ls(x),dat);
return min(tr[x].as,query(rs(x),dat));
}
il void pushup(int x)
{
// printf("1.as=%d\n",tr[1].as);
// printf("pushup : x=%d ls=%d rs=%d mx=%d\n",x,ls(x),rs(x),tr[rs(x)].mx);
tr[x].mx=max(tr[ls(x)].mx,tr[rs(x)].mx);tr[x].as=query(ls(x),tr[rs(x)].mx);
// printf("pushup x=%d mx=%d\n",x,tr[x].mx);
}
il void build(int x,int l,int r)
{
// printf("1.as=%d\n",tr[1].as);
// printf("build : x=%d l=%d r=%d\n",x,l,r);
tr[x].l=l;tr[x].r=r;tr[x].as=inf;
if(l==r)return void(tr[x].mx=val[l]-l);
int mid=(l+r)>>;build(ls(x),l,mid);build(rs(x),mid+,r);pushup(x);
}
il void modify(int x,int dat)
{
// printf("1.as=%d\n",tr[1].as);
// printf("modify : x=%d dat=%d\n",x,dat);
if(tr[x].l==tr[x].r)return void(tr[x].mx=val[dat]-dat);
int mid=(tr[x].l+tr[x].r)>>;if(mid>=dat)modify(ls(x),dat);else modify(rs(x),dat);
pushup(x);
} int main()
{
// freopen("zp.in","r",stdin);freopen("zp.out","w",stdout);
n=read();m=read();op=read();rp(i,,n)val[i]=val[i+n]=read();
build(,,n<<);printf("%d\n",as=tr[].as+n-);
rp(i,,m)
{
int x=read()^(as*op),y=read()^(as*op);val[x]=val[x+n]=y;
modify(,x);modify(,x+n);printf("%d\n",as=tr[].as+n-);
}
return ;
}
这儿是代码QAQ
洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈的更多相关文章
- 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)
题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...
- 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp
正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)
Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...
- Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)
洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
随机推荐
- 提一下InfoQ
昨天在微信读书中整理了一个"架构师"清单,把InfoQ中文社区这两年发布的电子书整理到了一起,分享给了团队成员. 如果你去研究InfoQ中文社区,就会发现其中一个人与之因缘际会的相 ...
- 在Java API设计中,面向接口编程的思想,以及接口和工厂的关系
现在的java API的设计中,提倡面向接口的编程,即在API的设计中,参数的传递和返回建议使用接口,而不是具体的实现类,如一个方法的输入参数类型应该使用Map接口,而不是HashMap或Hashta ...
- EventBus vs Otto vs Guava--自定义消息总线
同步发表于http://avenwu.net/ioc/2015/01/29/custom_eventbus Fork on github https://github.com/avenwu/suppo ...
- Caffe、TensorFlow、MXnet三个开源库对比+主流分类模型对比
库名称 开发语言 支持接口 安装难度(ubuntu) 文档风格 示例 支持模型 上手难易 Caffe c++/cuda c++/python/matlab *** * *** CNN ** MXNet ...
- Go指南练习_rot13Reader
https://tour.go-zh.org/methods/23 一.题目描述 有种常见的模式是一个 io.Reader 包装另一个 io.Reader,然后通过某种方式修改其数据流. 例如,gzi ...
- 重定向android log
android里面的log输出以往都是在eclipse里面看,如果通过USB连接电脑,可以输出到PC上. try { //adb logcat -v threadtime > logcat.tx ...
- IOC容器特性注入第四篇:容器初始化
IOC容器,就是把各种服务都注入到容器里,想要什么就去拿什么,不仅解决服务类和接口类的耦合度还可以提高性能方便管理. 这里封装一个接口类和一个实现类 1.IContainerManager接口 pub ...
- SQLSVR 之 EXISTS
来个实例看看 CREATE TABLE #temp( id BIGINT, name VARCHAR(max), age INT ) CREATE TABLE #tempmain( id BIGINT ...
- NLog类库的使用探索——认识配置+实习小感悟
1 写在前面 1.1 为什么学了软件 1.高考失败,分数不高,不能随心所欲 2.农村孩子,学点技术,将来有口饭吃 3.有科技含量,想玩电脑(那个时候是这么想的,那个时候觉得学计算机就是玩电脑) 1.2 ...
- linux zendOptimizer安装
ZendChina官方:下面介绍一下关于在linux环境下Zend Optimizer 3.3的安装方法.本篇文章是基于RHEL5架构的linux系统. (1)ZendOptimizer 3.3.3版 ...