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. Java简单方法批量修改Windows文件夹下的文件名(简单IO使用)

    package test.tttt; import java.io.File; import java.util.ArrayList; import java.util.List; public cl ...

  2. mysql-5.7 持久化统计信息详解

    一.持久化统计信息的意义: 统计信息用于指导mysql生成执行计划,执行计划的准确与否直接影响到SQL的执行效率:如果mysql一重启 之前的统计信息就没有了,那么当SQL语句来临时,那么mysql就 ...

  3. Xcode 5.1 编译模拟器以及真机都能使用的静态库

    Xcode 5.1.dmg 下载地址 http://pan.baidu.com/s/1jGJpKm6 1.新建 Framework & Library 工程 我起名叫ShowInfo,下面为其 ...

  4. controller断点进入失败:包路径问题

    controller 接受前端参数的方法(前端要有传值给controller的方法,后台要有接收值得方法) 1.@RequestParam 接收表单参数 2.@RequestBody 接收json字符 ...

  5. 铁乐学Python_day08作业

    1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数. apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 通过 ...

  6. Windows程序设计(Charles Petzold)HELLOWIN程序实现

    /*-------------------------------------------------------------- HELLOWIN.C--DisPlays "Hello, W ...

  7. npm使用小结

    npm包管理工具使用小结 npm(node package manager)是一个node包管理工具,我们可以方便的从npm服务器下载第三方包到本地使用. 安装: NPM是随同NodeJS一起安装的包 ...

  8. python第十三课——嵌套循环

    2.嵌套循环: 概念:循环中再定义循环,称为嵌套循环: [注意]嵌套循环可能有多层,但是一般我们实际开发最多两层就可以搞定了(99%的情况) 格式: 1).while中套while常用 2).whil ...

  9. ElasticSearch 简单的 搜索 聚合 分析

    一. 搜索1.DSL搜索 全部数据没有任何条件 GET /shop/goods/_search { "query": { "match_all": {} } } ...

  10. kubernetes 认证授权

    每个Kubernetes集群都有一个集群根证书颁发机构(CA). 集群中的组件通常使用CA来验证API server的证书,由API服务器验证kubelet客户端证书等.为了支持这一点,CA证书包被分 ...