洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意
Sol
首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的。
证明不会,考场上拍了3w组没错应该就是对的吧。。。
首先把数组倍长一下方便枚举起点,然后就是一个单调队列的模型了。整理一下我们需要求的东西就是这个
\]
(\(t[j]\)表示第\(j\)个位置出现的时间,其实\(\max\)的上界应该是\(i + n - 1\)的,但是显然后面的部分都不会更优)
其中\(n-1\)和\(t[j] - j\)可以直接算,这玩意儿可以用线段树维护。
对于每个区间维护\(mx[i]\)表示区间最大值,\(ans[i]\)表示在右区间的影响下,左区间的\(min(i + \max\text{后缀})\)
合并时考虑右区间对左区间的影响。
如果\(mx[rs] < mx[ls]\),我们可以直接用\(ans[ls]\)更新答案,然后递归\(ls(rs)\)
否则用mid更新一下答案然后递归\(ls(ls)\)
这样每次可以消除掉一半的区间,因此复杂度是\(O(nlog^2n)\)
最后询问的时候可以直接拿\([n + 1, 2n]\)的最大值去二分,实际上这部分的值就是\(max[1, n] - n\)
那么只需要维护\([1, n]\)的线段树就行了
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 10, INF = 1e9 + 7;
template<typename A, typename B> inline bool chmin(A &x, B y) {
if(x > y) {x = y; return 1;}
else return 0;
}
template<typename A, typename B> inline bool chmax(A &x, B y) {
if(x < y) {x = y; return 1;}
return 0;
}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, P, t[MAXN], q[MAXN];
int ans[MAXN], mx[MAXN];
#define ls k << 1
#define rs k << 1 | 1
int Query(int k, int l, int r, int val) {
if(l == r) return l + max(mx[k], val);
int mid = l + r >> 1;
if(val < mx[rs]) return min(ans[k], Query(rs, mid + 1, r, val));
else return min(mid + val + 1, Query(ls, l, mid, val));
}
void update(int k, int l, int r) {
mx[k] = max(mx[ls], mx[rs]);
ans[k] = Query(ls, l, (l + r) >> 1, mx[rs]);
}
void Modify(int k, int l, int r, int p, int v) {
if(l == r) {mx[k] = v; return ;}
int mid = l + r >> 1;
if(p <= mid) Modify(ls, l, mid, p, v);
else Modify(rs, mid + 1, r, p, v);
update(k, l, r);
}
void Build(int k, int l, int r) {
if(l == r) {mx[k] = t[l]; return ;}
int mid = l + r >> 1;
Build(ls, l, mid); Build(rs, mid + 1, r);
update(k, l, r);
}
int main() {
N = read(); M = read(); P = read();
for(int i = 1; i <= N; i++) t[i] = read();
for(int i = 1; i <= N; i++) t[i] -= i;
Build(1, 1, N); int las = 0;
printf("%d\n", las = (Query(1, 1, N, mx[1] - N) + N - 1));
while(M--) {
int x = read(), y = read();
if(P) x ^= las, y ^= las;
Modify(1, 1, N, x, y - x);
printf("%d\n", las = (Query(1, 1, N, mx[1] - N) + N - 1));
}
return 0;
}
/*
5 0 0
1 2 5 4 0
*/
洛谷P4425 [HNOI/AHOI2018]转盘(线段树)的更多相关文章
- [HNOI/AHOI2018]转盘(线段树优化单调)
gugu bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...
- 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...
- bzoj3064/洛谷P4314 CPU监控【线段树】
好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...
随机推荐
- Dynamic Programming | Set 2 (Optimal Substructure Property)
正如我们在 Dynamic Programming | Set 1 (Overlapping Subproblems Property) 中讨论的那样,当一个问题具有以下2种性质时,建议使用动态规划来 ...
- WeexSDK之注册Modules
注册Modules的流程和注册Components非常类似. + (void)_registerDefaultModules { [self registerModule:@"dom&quo ...
- [UWP]如何实现UWP平台最佳图片裁剪控件
前几天我写了一个UWP图片裁剪控件ImageCropper(开源地址),自认为算是现阶段UWP社区里最好用的图片裁剪控件了,今天就来分享下我编码的过程. 为什么又要造轮子 因为开发需要,我们需要使用一 ...
- springboot学习笔记-thymeleaf
Thymeleaf的介绍 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: ...
- docker 安装Nginx
1.使用镜像加速拉取nginx [root@192 ~]# $ docker pull registry.docker-cn.com/library/nginx:1.15 2.通过docker run ...
- PMS构造函数以及apk如何扫描
一.PackageManagerService构造函数 1.创建data目录下面以及文件(settings的构造函数),然后再添加6个SharedUserSetting 2.开始扫描并且解析APK 3 ...
- tk.mybatis通用工具采坑记
tk.mybatis通用工具pom <!--mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot&l ...
- linux下应用程序性能剖分神器gprofiler-tools-安装和使用
最近在摆弄算法的的优化,需要剖分一下算法的瓶颈,就找了一些代码剖分工具,其中 gprofileer-tools是很不错的工具,gperftools时google开源的一款C++性能分析分析工具,git ...
- Testing - 软件测试知识梳理 - 自动化测试
软件开发的过程是一个持续集成和改进的过程,而每一次的改进都可能引进新bug,因此当软件的一部,或者全部修改时,都需要对软件产品重新进行测试. 其目的是要验证修改后的产品是符合需求的,而当没有自动化测试 ...
- HoloLens开发手记-开发概述Development overview
开发HoloLens全息应用将使用UWP平台(Universal Windows Platform),所有的HoloLens应用都是Win10通用应用,所有UWP通用应用都可以在HoloLens上运行 ...