(HN)AHOI2018 转盘
题意:
有 \(n\) 个格子围成一圈,每个格子里有一个物品,每个物品的出现时间为 \(T_i\) 。开始时选择一个格子为起点,每个单位时间可以向前走一格或不动,若当前格的物品已出现则将其标记。有 \(m\) 次修改,每次修改一个物品的出现时间,并询问将所有物品标记的最短时间。
题解:
猜一下一个最优方案:选择一个点后停留一段时间后直接走一圈标记所有物品。感性分析一下是对的,因为多走超过一圈的地方可以用等待来代替。具体分析或证明可以看其他神仙的博客。
那么得到柿子:
\]
(前者为最大等待时间)。
整理一下柿子,设 \(a_j=T_j-j\) :
\]
我们发现对于 \([i+ n,2n]\) 的答案显然不会更优,所以我们减少一下限制,即:
\]
发现最后对答案可能产生贡献的点的 \(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 转盘的更多相关文章
- [HNOI/AHOI2018]转盘(线段树优化单调)
gugu bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- [HNOI/AHOI2018]转盘
一个结论:一定存在一个最优解只走一圈.否则考虑从最后一个结束位置开始一定可以达到相同效果 画个图,类似是一种斜线感觉 考虑一个高度贡献的最高点 对于i开始的连续n个,答案是:max(Tj-j)+i+n ...
- BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)
显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...
- BZOJ5286:[HNOI/AHOI2018]转盘——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5286 https://www.luogu.org/problemnew/show/P4425 ht ...
- P4425 【[HNOI/AHOI2018]转盘】
颂魔眼中的一眼题我大湖南竟无一人\(AC\) 首先我们考虑一个性质:我们肯定存在一种最优解,满足从某个点出发,一直往前走,不停下来. 证明:我们假设存在一种最优解,是在\(t_i\)的时候到达\(a\ ...
- LCT小小结
模板题P3690 基础题P3203[HNOI2010]弹飞绵羊 \(access\)是搞出一条端点为\(x,y\)的路径 , 且维护的是实子树的信息 . 由于题目比较简单 , \(access\)时还 ...
- P4332 [SHOI2014]三叉神经树(LCT)
Luogu4332 LOJ2187 题解 代码-Tea 题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\ ...
- HNOI2018
d1t1[HNOI/AHOI2018]寻宝游戏 感觉很神,反正我完全没想到 分开考虑每一位,对于每一位i计算一个二进制数b[i], 对于第i位,从后往前第j个数这一位是1,那么b[i]^=(1< ...
随机推荐
- docker-构建建tomcat镜像并启动容器
1.下载一个tomcat8,解压好改名为tomcat并配置端口为80,删除webapps下的默认的应用,修改tomcat/bin目录下脚本的权限,chmod +x *.sh 2.路径一般放在/usr/ ...
- 1552146271@qq.com
北京时间9月27日早间消息,美国外卖服务DoorDash周四宣布,一项安全漏洞暴露了该公司大约490万客户.商家和送货员的个人数据. 这家总部位于旧金山的公司在一份声明中说,此次泄露的信息可能包括大约 ...
- android7.0关于TelephonyManager.getDeviceId()返回null的问题
在android7.0的系统下发现TelephonyManager.getDeviceId()在权限允许的情况下取得返回值也为null,解决方法如下: public static String get ...
- cover-view子节点溢出父节点被剪切的问题
因为之前在使用自定义tabbar的时候,使用了cover-view, 导致溢出父节点的那部分被剪切掉,因为没找到有类似的问题出现, 所以我在布局方面做了调整: .tab-bar { overflowY ...
- 《Redis深度历险:核心原理和应用实践》千帆竞发——分布式锁
- windows10安装.netframework3.5
先挂载,看看挂载到哪个盘了,假设是I盘 然后按住shift 点鼠标右键,打开powershell,运行下面命令: dism.exe /online /enable-feature /featurena ...
- 「SP2713」GSS4 - Can you answer these queries IV
传送门 Luogu 解题思路 区间开方以及区间求和. 考虑用线段树来做. 开方操作看似没有任何结合律可言,但这题有另外一个性质: 一个数的初始值不超过 \(10^{18}\) ,而这个数被开方6次左右 ...
- Matplotlib 饼图
章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...
- Django创建完全独立的APP
我们之前已经完成了项目的结构搭建,但是,在Django当中,我们强调的一个重要概念是app,比如Django自带的admin就是一个成功的app典范,那么我们应该如果整理自己的项目结构,才能让我们的a ...
- CentOS 7安装/卸载Redis,配置service服务管理
Redis简介 Redis功能简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 相比于传统的关系型数据库,Redis的存储方式是key-va ...