洛谷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 洛谷 ...
随机推荐
- 使用Ajax异步上传图片的方法(html,javascript,php)
前两天项目中需要用到异步上传图片和显示上传进度的功能,于是找了很多外国的文章,翻山越岭地去遇上各种坑,这里写篇文章记录一下. HTML <form id="fileupload-for ...
- 提升linux下TCP服务器并发连接数(limit)
https://cloud.tencent.com/developer/article/1069900 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进 ...
- [hive] hive 安装、配置
一.hive安装 1.官网下载 1.2.2版本 http://apache.fayea.com/hive/hive-1.2.2/ 2. 解压,此处目录为 /opt/hadoop/hive-1.2.2 ...
- [BOOK] Applied Math and Machine Learning Basics
<Deep Learning> Ian Goodfellow Yoshua Bengio Aaron Courvill 关于此书Part One重难点的个人阅读笔记. 2.7 Eigend ...
- linux Email 体系
大致了解了DNS与邮件服务器之间的关系后,接下来我们介绍邮件到底是如何传送到目的邮件主机的.下面我们分成“寄信”与“收信”两个主要的邮件服务器使用方式进行介绍.先说明关于“寄信”的部分.通常我们都是使 ...
- PDF to image
http://www.verypdf.com/pdf2tif/pdf-to-image/help.htm http://www.softinterface.com/DL/DL_Alternate_Do ...
- 10.23 crm(3)
2018-10-23 20:34:30 继续增加新的功能!在代码注释里面有! 越努力,越幸运!永远不要高估自己! 还有明天再加上rbca权限管理系统就完美了! 然后crm做完,再过几天不挂针一切好了也 ...
- 堆的C语言实现
在C++中,可以通过std::priority_queue来使用堆. 堆的C语言实现: heap.c /** @file heap.c * @brief 堆,默认为小根堆,即堆顶为最小. */ #in ...
- Kernel parameter requirements ( Linux DB2)
Kernel parameter requirements ( Linux DB2) https://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/ ...
- bootstrapValidator多字段联合验证(如开始日期和结束日期中,开始日期不可晚于结束日期)
接触bootstrapvalidator时间不久,最近需要多个字段共同验证,网上查了一下未找到,查阅api文档,发现确实可以实现. 先看dom <div class="form-gro ...