正解:线段树+单调栈

解题报告:

传送门!

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] 线段树+单调栈的更多相关文章

  1. 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)

    题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...

  2. 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp

    正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...

  3. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  4. Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)

    Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...

  5. Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...

  6. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  7. 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)

    洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...

  8. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  9. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

随机推荐

  1. cordova打包vue2(webpack)android、ios app

    使用cordova打包vue2(webpack)app for android ios1.vue项目通过vue-cli脚手架建立项目,使用webpack进行打包,下边是一整套命令. #npm 版本最好 ...

  2. 国内AR行业现状研究之百度的AR

    AR(Augmented Reality),中文翻译增强现实.按我原来的知识体系,VR/AR的技术构成是相同的,只是追求的方向不同.VR是虚拟笼罩现实.让虚拟就是现实:AR则让虚拟进入现实.二者最终看 ...

  3. Git 推送操作

    Jerry 修改了他的最后一次提交的修改操作,他已经准备好将更改.推操作的数据永久存储的 Git 仓库.推操作成功后,其他开发人员可以看到Jerry 的变化. 他执行的git日志命令来查看提交的细节. ...

  4. Halcon的数据类型

    两大类: 1.图形参数Iconic (image, region, XLD) 2.与控制参数Control (string, integer, real, handle), 在Halcon算子的参数中 ...

  5. 重新入坑-IntelliJ Maven

    写Restful的服务,使用IntelliJ+maven,发现有几个依赖总是没法配置好.通过检查POM.xml,发现犯了错误,<dependency>写到了<dependencies ...

  6. Python3运算符

    一.算术运算符 二.比较运算符 三 .赋值运算符 四 .位运算符 按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下: 下表中变量 a 为 60,b 为 13二进制格式如下: ...

  7. 音视频处理ffmpeg使用

    参考资料: [url]http://blog.163.com/prosen@yeah/blog/static/12251328720099101378975/ http://ffmpeg.org/ff ...

  8. eclipse里将java工程改web工程

    转自:http://blog.csdn.net/heirenheiren/article/details/8488245 把一个普通的eclipse项目转成web项目 1.  编辑工程的.projec ...

  9. bootstrap-select 多选下拉框使用教程

    http://silviomoreto.github.io/bootstrap-select/ 一.使用bootstrap-select组件时,先引用下列文件 最后一个文件 defaults-zh_C ...

  10. [Artoolkit] Can I Use LGPL code for commercial application

    这是一个比较普遍但又容易被忽略的问题. From: http://answers.google.com/answers/threadview/id/439136.html 假设背景: - want t ...