题意:

有 \(n\) 个格子围成一圈,每个格子里有一个物品,每个物品的出现时间为 \(T_i\) 。开始时选择一个格子为起点,每个单位时间可以向前走一格或不动,若当前格的物品已出现则将其标记。有 \(m\) 次修改,每次修改一个物品的出现时间,并询问将所有物品标记的最短时间。

题解:

猜一下一个最优方案:选择一个点后停留一段时间后直接走一圈标记所有物品。感性分析一下是对的,因为多走超过一圈的地方可以用等待来代替。具体分析或证明可以看其他神仙的博客。

那么得到柿子:

\[ans=\displaystyle \min _{i=1}^n \{ \max_{j=i}^{i+n-1} \{T_j-(j-i)\}\}+n-1
\]

(前者为最大等待时间)。

整理一下柿子,设 \(a_j=T_j-j\) :

\[ans=\displaystyle \min _{i=1}^n \{ \max_{j=i}^{i+n-1} \{a_j\}+i\}+n-1
\]

我们发现对于 \([i+ n,2n]\) 的答案显然不会更优,所以我们减少一下限制,即:

\[ans=\displaystyle \min _{i=1}^n \{ \max_{j=i}^{2n} \{a_j\}+i\}+n-1
\]

发现最后对答案可能产生贡献的点的 \(a_j\) 一定从右到左单增。

于是我们直接用线段树维护区间最大值和 \(\min_{i=l}^{r/2}\{\max_{j=l}^{r}\{a_j\}+i\}\)即可,即维护一个单调栈。时间复杂度为 \(O(m\log^2 n)\) .

#include<cstdio>
#include<algorithm>
using namespace std;
inline int gi()
{
char c; int x=0;
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x;
}
const int N=200005;
int n,m,p,ans,t[N],st[N<<2],mx[N<<2];
#define lx (x<<1)
#define rx (x<<1|1)
int query(int x, int l, int r, int w)
{
if(l==r) return l+max(w,mx[x]);
int mid=l+r>>1;
if(mx[rx]>=w) return min(st[x],query(rx,mid+1,r,w));
return min(mid+1+w,query(lx,l,mid,w));
}
void pushup(int x, int l, int r)
{
int mid=l+r>>1;
mx[x]=max(mx[lx],mx[rx]);
st[x]=query(lx,l,mid,mx[rx]);
}
void build(int x, int l, int r)
{
if(l==r)
{
mx[x]=t[l],st[x]=t[l]+l;
return ;
}
int mid=l+r>>1;
build(lx,l,mid),build(rx,mid+1,r);
pushup(x,l,r);
}
void update(int x, int l, int r, int s)
{
if(l==r)
{
mx[x]=t[l],st[x]=t[l]+l;
return ;
}
int mid=l+r>>1;
s<=mid?update(lx,l,mid,s):update(rx,mid+1,r,s);
pushup(x,l,r);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
#endif
n=gi(),m=gi(),p=gi();
for(int i=1;i<=n;++i) t[i]=gi()-i,t[i+n]=t[i]-n;
build(1,1,n<<1);
printf("%d\n",ans=st[1]+n-1);
while(m--)
{
ans*=p;
int x=gi()^ans,y=gi()^ans;
t[x]=y-x,t[x+n]=t[x]-n;
update(1,1,n<<1,x),update(1,1,n<<1,x+n);
printf("%d\n",ans=st[1]+n-1);
}
}

(HN)AHOI2018 转盘的更多相关文章

  1. [HNOI/AHOI2018]转盘(线段树优化单调)

    gugu  bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...

  2. 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)

    题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...

  3. [HNOI/AHOI2018]转盘

    一个结论:一定存在一个最优解只走一圈.否则考虑从最后一个结束位置开始一定可以达到相同效果 画个图,类似是一种斜线感觉 考虑一个高度贡献的最高点 对于i开始的连续n个,答案是:max(Tj-j)+i+n ...

  4. BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)

    显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...

  5. BZOJ5286:[HNOI/AHOI2018]转盘——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5286 https://www.luogu.org/problemnew/show/P4425 ht ...

  6. P4425 【[HNOI/AHOI2018]转盘】

    颂魔眼中的一眼题我大湖南竟无一人\(AC\) 首先我们考虑一个性质:我们肯定存在一种最优解,满足从某个点出发,一直往前走,不停下来. 证明:我们假设存在一种最优解,是在\(t_i\)的时候到达\(a\ ...

  7. LCT小小结

    模板题P3690 基础题P3203[HNOI2010]弹飞绵羊 \(access\)是搞出一条端点为\(x,y\)的路径 , 且维护的是实子树的信息 . 由于题目比较简单 , \(access\)时还 ...

  8. P4332 [SHOI2014]三叉神经树(LCT)

    Luogu4332 LOJ2187 题解 代码-Tea 题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\ ...

  9. HNOI2018

    d1t1[HNOI/AHOI2018]寻宝游戏 感觉很神,反正我完全没想到 分开考虑每一位,对于每一位i计算一个二进制数b[i], 对于第i位,从后往前第j个数这一位是1,那么b[i]^=(1< ...

随机推荐

  1. VUe for循环if 的使用和函数的使用 (笔记)

    结果如图: 代码html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. Android APK反编译就这么简单 详解(附图)--转

    转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...

  3. 单词统计——基本Java实现(无特殊设置)

    日期:2019.5.4 博客期:066 星期六 今天写了统计一篇文章中的单词数量,把出现最多的前几个显示出来,差不多就是这么个程序! 实现思想: 分布处理: 1.读取文件,将文件里的字符串按照换行符和 ...

  4. centos 安装 memcached

    centos 安装 memcached 1. 安装依赖: libeventyum install libevent-devel 2. 获取最新版本wget http://memcached.org/l ...

  5. 吴裕雄--天生自然JAVAIO操作学习笔记:内存操作流、管道流与打印流操作

    import java.io.* ; class Send implements Runnable{ // 线程类 private PipedOutputStream pos = null ; // ...

  6. 织梦 dede runphp=yes SQL语句操作

    个人实例dede:channelartlist 下循环出 channel 栏目 中的 文章 {dede:sql sql='select * from dede_arctype where reid = ...

  7. Linux:Shell-Bash基本功能

    1.历史命令 history [选项] [历史命令保存文件] 选项:-c  清空历史命令 -w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history 历史命令默认保存1000条,可以 ...

  8. ubnutu18.4 修改交换分区大小

    ubuntu18.04默认的swap文件在根目录/下,名字是swapfile 1.查看交换分区大小  也可以使用系统监视器查看 free -m 2.创建一个swap文件 :大小为8g count= 3 ...

  9. extjs开发———用extJS简单写一个饼状图

    先上效果图: js编写部分简单如下,先插入一个模块,然后给模块中添加内容. var myChart1 = echarts.init(document.getElementById('myChart1' ...

  10. jenkins#构建并部署springboot的jar包

    0. 前提是有一个可以用的没有问题的Jenkins环境,这是基础 1. 安装publish over ssh 插件,(如果网速太慢,请去github 克隆代码,然后自己构建,然后上传安装此插件) 2. ...