P4425 【[HNOI/AHOI2018]转盘】
颂魔眼中的一眼题我大湖南竟无一人\(AC\)
首先我们考虑一个性质:我们肯定存在一种最优解,满足从某个点出发,一直往前走,不停下来。
证明:我们假设存在一种最优解,是在\(t_i\)的时候到达\(a\)点,那么我肯定会在\(t_i - x(x≥1)\)的时间会到达\(a - 1\)号点
我们假设\(x != 1\),即我们会在\(a-1\)点进行停留,此时那么我们到达\(a - 2\)号点的时间\(<t_i - 2\),到达\(a-3\)号点的时间\(<t_i - 3\)
那么如果我有一个点\(a - y\)是在\(t_i - y\)时刻出现,那么我们不能取到这个点,必须要重新转一圈
那么如果\(x = 1\),且每一次走都没停下来,我们可以保证我们在\(x!=1\)经过该点后经过该点
所以说如果\(x!=1\)可以经过的所有点我们肯定在\(x==1\)的情况下都能经过,而且\(x==1\)情况下的一些点,\(x != 1\)不一定能经过,所以我们肯定每一次取\(x==1\)是一种最优情况
然后我们考虑进一步转化题意:假设我在一个点,从\(T_i\)时刻出发,满足转一圈刚好标记所有点,那么我们\(T_i\)以前的时间实际上是没有用的
由于环不好处理,而且转化后我们保证只要走一圈,所以我们可以断环成链
于是我们可以考虑,找到一个最好的起点\(i\),找到最好的\(T_i\),使得从i点在\(T_i\)时刻出发答案最优,即我们要求这个式子:\(min(T_i+n)\)其中满足对于任意的\(x\),\(T_i≥t_x-x+i\)
即我们要求:\(min_{i=1}^n(n + max_{x=i+1}^{2*n}(i-x + t_x))=min_{i=1}^n(n+i+max_{x=i+1}^{2*n}(x-t_x))\)
所以我们枚举每一个起点,找到最大的\(t_x-x\),用线段树维护,单次操作复杂度为\(O(NlogN)\),现在问题要考虑怎么修改
令\(a_i=t_i-i\),所以原式变成\(n+min_{i=1}^n(max_{x=i+1}^{2*n}(a_x)+i)\)
不难发现,\(max_{x=i+1}^{i+n}(a_x)\)是单调不增的。于是,我们维护一个单调栈,对于每一个\(max_{x=i+1}^{i+n}(a_x)\)连续的一段,找到一个最小的\(i\)即可,单调栈可以用线段树来维护(详见我楼房重建的题解),把楼房重建的求和改成\(max\)就行了,于是复杂度就变成了\(O(Nlog^2N)\)
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
#define rep(i, s, t) for(int i = s; i <= t; ++ i)
#define ls k * 2
#define rs k * 2 + 1
#define maxn 100005
int n, m, p, last, a[maxn << 1], ma[maxn << 3], ans[maxn << 3];
int query(int k, int l, int r, int v) {
if(l == r) return l + max(v, ma[k]);
int mid = (l + r) >> 1;
if(ma[rs] >= v) return min(ans[k], query(rs, mid + 1, r, v));
return min(mid + v + 1, query(ls, l, mid, v));
}
inline void updata(int k, int l, int r, int mid) {
ma[k] = max(ma[ls], ma[rs]), ans[k] = query(ls, l, mid, ma[rs]);
}
void modify(int k, int l, int r, int ll) {
if(l == r) return (void)(ans[k] = a[l] + l, ma[k] = a[l]);
int mid = (l + r) >> 1;
if(ll <= mid) modify(ls, l, mid, ll);
else modify(rs, mid + 1, r, ll);
updata(k, l, r, mid);
}
void build(int k, int l, int r) {
if(l == r) return (void)(ans[k] = a[l] + l, ma[k] = a[l]);
int mid = (l + r) >> 1;
build(ls, l, mid), build(rs, mid + 1, r), updata(k, l, r, mid);
}
int main() {
n = read(), m = read(), p = read();
rep(i, 1, n) a[i] = read() - i, a[i + n] = a[i] - n;
build(1, 1, n * 2);
printf("%d\n", last = ans[1] + n - 1);
rep(i, 1, m) {
int x = read() ^ (p * last), y = read() ^ (p * last);
a[x] = y - x, a[x + n] = y - x - n, modify(1, 1, 2 * n, x), modify(1, 1, 2 * n, x + n);
printf("%d\n", last = ans[1] + n - 1);
}
return 0;
}
P4425 【[HNOI/AHOI2018]转盘】的更多相关文章
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- [HNOI/AHOI2018]转盘(线段树优化单调)
gugu bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...
- BZOJ5286:[HNOI/AHOI2018]转盘——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5286 https://www.luogu.org/problemnew/show/P4425 ht ...
- [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),所以也 ...
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
- [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)
P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...
- 【LG4437】[HNOI/AHOI2018]排列
[LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
随机推荐
- App开放接口API安全性之Token签名Sign的设计与实现
前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等, ...
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- JavaNetty心跳监控
import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; import java ...
- C# vb .net实现色调调整特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的色调调整呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- python3.7 64位中安装pygame1.9.3
1.我是用pip命令来安装的,首先,打开cmd,输入pip,检查电脑中有没有安装这个插件(一般python2.7以上自带pip工具) 2.更新pip工具的命令:python -m pip instal ...
- 5_PHP数组_3_数组处理函数及其应用_7_数组排列函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组排列函数 1. sort() 函数 程序: <?php $array = array("img ...
- 【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)
题目链接 因为每个数都是\(10^5\)以内,考虑直接用\(bitset\)维护. \(a-b=x\),其实就是看是否有\(p\)和\(p+x\)同时存在,直接\(bitset\)移位按位与一下就好了 ...
- JS中BOM和DOM常用的事件
总结:window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新 ...
- spring事务什么时候会自动回滚
在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...
- Android自动化测试探索(四)uiautomator2简介和使用
uiautomator2简介 项目Git地址: https://github.com/openatx/uiautomator2 安装 #1. 安装 uiautomator2 使用pip进行安装, 注意 ...