题意

题目链接

Sol

首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的。

证明不会,考场上拍了3w组没错应该就是对的吧。。。

首先把数组倍长一下方便枚举起点,然后就是一个单调队列的模型了。整理一下我们需要求的东西就是这个

\[n - 1 + \min_{i=1}^n i + (\max_{j=i}^{2n} t[j] - j)
\]

(\(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]转盘(线段树)的更多相关文章

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

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

  2. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  3. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  4. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

  5. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  6. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  7. Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)

    题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...

  8. 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...

  9. bzoj3064/洛谷P4314 CPU监控【线段树】

    好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...

随机推荐

  1. Thinking in Java Chapter 13

    From Thinking in Java 4th Edition String对象是不可变的.String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包 ...

  2. HttpClient Fluent API 高并发优化

    apache的httpcomponents-client 4.2之后提供了一套易于使用的facade API称为Fluent API,对于一般使用场景来说,使用起来非常简便,且性能也有一定保证,因为其 ...

  3. Linux pwn入门教程(6)——格式化字符串漏洞

    作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...

  4. vsftpd安装配置以及常见问题解决

    vsftpd安装配置以及踩坑解决办法,Centos7 nginx已经配置成功了,但是使用http始终没办法访问到图片,那么你来对地方了(在文章末尾是原因) 配置nginx教程:http://blog. ...

  5. 第十节:详细讲解一下Java多线程,随机文件

    前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...

  6. 使用autogen生成应用程序遇到问题及解决方法

    从github上下载的代码,运行autogen.sh的时候,上报错误: $ ./autogen.sh --prefix=/usr./autogen.sh: 10: ./autogen.sh: auto ...

  7. OC学习4——OC新特性之块(Block)

    文章主要参考  关于OC中的block自己的一些理解(一) 对块的深入理解  浅析ios开发中Block块语法的妙用 1.关于block block的作用:保存一段代码. 苹果官方推荐的一种语法,类似 ...

  8. redis lru实现策略

    转载自http://blog.chinaunix.net/uid-20708886-id-5753422.html 在使用redis作为缓存的场景下,内存淘汰策略决定的redis的内存使用效率.在大部 ...

  9. 3-2 模板语法(vue中的内容写法)

    插值表达式.v-text.v-html的用法

  10. rsync实现目录同步

    rsync rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 外文名 rsync 全     ...