5286: [Hnoi2018]转盘

链接

分析:

  $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{i + n - 1} \{ a_{j}+i \} \} +n-1$

  $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{2n} \{ a_{j}+i \} \} +n-1$

  然后线段树,每个区间维护两个值$mx[rt]=\max\limits_{i=l}^{r} a_i,\ $$ans[rt] = \max\limits_{i=l}^{mid}\{ \max\limits_{j = l} ^ {r} {a_j + i} \}$,那么答案是ans[1]。

  考虑如何合并: 两个区间合并到一起,右区间会对左区间的左右点产生影响。即如果右区间的最大值可以去贡献给左区间的某个点,可以递归修改。复杂度$logn$,加上线段树复杂度,总复杂度$O(nlog^2n)$

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
#define Root 1, n << 1, 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
int a[N], T[N], mx[N << ], ans[N << ]; int Merge(int l,int r,int rt,int x) {
if (l == r) return l + max(mx[rt], x);
int mid = (l + r) >> ;
if (mx[rt << | ] >= x) return min(ans[rt], Merge(rson, x));
else return min(Merge(lson, x), mid + + x);
}
void pushup(int l,int r,int rt) {
mx[rt] = max(mx[rt << ], mx[rt << | ]);
ans[rt] = Merge(l, (l + r) >> , rt << , mx[rt << | ]);
}
void build(int l,int r,int rt) {
if (l == r) { mx[rt] = a[l], ans[rt] = T[l]; return ; }
int mid = (l + r) >> ;
build(lson); build(rson);
pushup(l, r, rt);
}
void update(int l,int r,int rt,int p) {
if (l == r) { mx[rt] = a[l], ans[rt] = T[l]; return ; }
int mid = (l + r) >> ;
if (p <= mid) update(lson, p);
else update(rson, p);
pushup(l, r, rt);
}
int main() {
int n = read(), m = read(), p = read();
for (int i = ; i <= n; ++i) {
T[i] = T[i + n] = read();
a[i] = T[i] - i, a[i + n] = T[i + n] - i - n;
}
build(Root);
int lastans = ans[] + n - ;
printf("%d\n", lastans);
while (m --) {
int x = read(), y = read();
if (p) x ^= lastans, y ^= lastans;
T[x] = T[x + n] = y; a[x] = y - x, a[x + n] = y - x - n;
update(Root, x); update(Root, x + n);
lastans = ans[] + n - ;
printf("%d\n", lastans);
}
return ;
}

5286: [Hnoi2018]转盘的更多相关文章

  1. bzoj 5286: [Hnoi2018]转盘

    Description Solution 首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长 那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)) ...

  2. [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)

    5286: [Hnoi2018]转盘 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 15  Solved: 11[Submit][Status][Di ...

  3. 【BZOJ5286】[HNOI2018]转盘(线段树)

    [BZOJ5286][HNOI2018]转盘(线段树) 题面 BZOJ 洛谷 题解 很妙的一道题目啊.(全世界除了我这题都有40分,就我是一个状压选手 首先来发现一些性质,我们走一圈一定不会更差. 为 ...

  4. [HNOI2018]转盘

    [HNOI2018]转盘 给你一个 \(n\) 元环, 你可以在 \(0\) 时刻从任意一个位置出发, 每一秒可以选择往后或者留在原地每个点有个参数 \(T_i\) , 当你走到 \(i\) 的时间 ...

  5. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  6. BZOJ5286: [Hnoi2018]转盘 (线段树)

    题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...

  7. [HNOI2018]转盘[结论+线段树]

    题意 题目链接 分析 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明: 如果要停留的话一定在出发点停留,这样后面的位置更容易取到. 走超过两圈的情况都可以 ...

  8. 【比赛】HNOI2018 转盘

    通过这题,我发现了我最大的缺陷,就是题目中重要的性质发现不了,所以导致后期根本做不了.还是要多做题,培养思维 对于这道题,来发现性质吧 对于每一条路线,因为它有用的就是最终的时刻,所以我们都可以把它变 ...

  9. 【题解】HNOI2018转盘

    何学长口中所说的‘一眼题’……然而实际上出出来我大HN全省也只有一个人A…… 首先我们需要发现一个性质:我们永远可以在最后一圈去标记所有的物品.倘若我们反复转圈,那么这完全是可以省下来的.所以我们破环 ...

随机推荐

  1. Jmeter入门--关联

    名称解释 关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据. 具体方法 Jmeter关联有两种方法:Xpath.正则表达式 方法一:Xpath主要用于响应是格式是 ...

  2. swift中变量的几种类型

    swift中变量的几种类型 swift中变量分为 optional,non-optional 以及 implicitly unwrapped optional 这几种类型 var nullablePr ...

  3. 用字典给Model赋值

    用字典给Model赋值 此篇教程讲述通过runtime扩展NSObject,可以直接用字典给Model赋值,这是相当有用的技术呢. 源码: NSObject+Properties.h 与 NSObje ...

  4. SQL语言DDL DML DCL TCL四种语言

    1.DDL(Data Definition Language)数据库定义语言:DDL使我们有能力创建或删 除表格.可以定义索引(键),规定表之间的链接,以及施加表间的 约束. • 常见DDL 语句: ...

  5. Linux 系统的网络基础_【all】

    网络基础 1.网线:568B: 白橙 橙色 白绿 蓝色 白蓝 绿色 白棕 棕色 2.交换机:电信号转发的网络设备,它可以为接入交换机的任2个网络节点设备提供电信号通信 3.路由器:连接局域网,广域网的 ...

  6. [转载]Matlab中插值函数汇总和使用说明

    http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,' ...

  7. 资料整理,SQL Server ,面试前复习笔记

    T-SQL 要掌握的知识点分类 SQL 面向数据库执行查询 SQL 从数据库取回数据 SQL 在数据库中插入新的记录 SQL 更新数据库中的数据 SQL 从数据库删除记录 SQL 创建新数据库 SQL ...

  8. September 12th 2017 Week 37th Tuesday

    Failure is the fog through which we glimpse triumph. 失败是迷雾,穿过它,我们就可以瞥见光明. Sometimes the fog may be t ...

  9. print(dir(...)) 打印对象或者类中的方法和函数

  10. 获取索引--------用range()和len()

    a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ'] for i in range(len(a)): print(i+1,a[i])