bzoj5286 [Hnoi2018]转盘
题目描述:
题解:
看了半个晚上终于明白了。
首先最优决策一定有:在起始点停留一段时间然后一直前进。
解释网上有很多,在这里不赘述了。
(由于是环,先把$T$数组倍长。)
首先基于决策我们的答案是$n-1+min_{i=1}^{n}i+max_{j=i}^{i+n-1}T[j]-j$
考虑到$i+n-1$的后面一定不会有$max$,我们可以把上式变成$n-1+min_{i=1}^{n}i+max_{j=i}^{2*n}T[j]-j$
那么右面那个的形式可以看做$min_{i=l}^{mid}i+max_{j=i}^{r}A[j]$,其中$A[j]=T[j]-j$
那么设$t[u]$等于上面这个是式子,$mx[u]=max_{i=l}^{r}A[i]$。
所以差不多是这个形状:

显然$mx[u]$可以从下往上$O(1)$转移。
至于$t$即答案数组,由于我们有线段树,所以在线段树上分治搞下去。
具体按$i$指向左边一半的左边还是右边讨论,两者取$min$。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,m,op,T[N<<],ans;
struct segtree
{
int t[N<<],mx[N<<];
int query(int l,int r,int u,int bas)
{
if(l==r)return l+max(bas,mx[u]);
int mid = (l+r)>>;
if(bas<=mx[u<<|])return min(query(mid+,r,u<<|,bas),t[u]);
else return min(query(l,mid,u<<,bas),mid++bas);
}
void update(int l,int r,int u)
{
int mid = (l+r)>>;
t[u] = query(l,mid,u<<,mx[u<<|]);
mx[u] = max(mx[u<<],mx[u<<|]);
}
void build(int l,int r,int u)
{
if(l==r){t[u]=T[l],mx[u]=T[l]-l;return ;}
int mid = (l+r)>>;
build(l,mid,u<<);
build(mid+,r,u<<|);
update(l,r,u);
}
void insert(int l,int r,int u,int qx)
{
if(l==r){t[u]=T[l],mx[u]=T[l]-l;return ;}
int mid = (l+r)>>;
if(qx<=mid)insert(l,mid,u<<,qx);
else insert(mid+,r,u<<|,qx);
update(l,r,u);
}
}tr;
int main()
{
read(n),read(m),read(op);
for(int i=;i<=n;i++)
read(T[i]),T[i+n]=T[i];
tr.build(,*n,);
printf("%d\n",ans=tr.t[]+n-);
for(int x,y,i=;i<=m;i++)
{
read(x),read(y);
if(op)x^=ans,y^=ans;
T[x] = y,T[x+n] = y;
tr.insert(,*n,,x);tr.insert(,*n,,x+n);
printf("%d\n",ans=tr.t[]+n-);
}
return ;
}
bzoj5286 [Hnoi2018]转盘的更多相关文章
- BZOJ5286: [Hnoi2018]转盘 (线段树)
题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...
- 【BZOJ5286】[HNOI2018]转盘(线段树)
[BZOJ5286][HNOI2018]转盘(线段树) 题面 BZOJ 洛谷 题解 很妙的一道题目啊.(全世界除了我这题都有40分,就我是一个状压选手 首先来发现一些性质,我们走一圈一定不会更差. 为 ...
- [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 15 Solved: 11[Submit][Status][Di ...
- 5286: [Hnoi2018]转盘
5286: [Hnoi2018]转盘 链接 分析: $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{i + n - 1} \{ a_{j}+i \} \} +n- ...
- [HNOI2018]转盘
[HNOI2018]转盘 给你一个 \(n\) 元环, 你可以在 \(0\) 时刻从任意一个位置出发, 每一秒可以选择往后或者留在原地每个点有个参数 \(T_i\) , 当你走到 \(i\) 的时间 ...
- bzoj 5286: [Hnoi2018]转盘
Description Solution 首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长 那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)) ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- [HNOI2018]转盘[结论+线段树]
题意 题目链接 分析 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明: 如果要停留的话一定在出发点停留,这样后面的位置更容易取到. 走超过两圈的情况都可以 ...
- 【比赛】HNOI2018 转盘
通过这题,我发现了我最大的缺陷,就是题目中重要的性质发现不了,所以导致后期根本做不了.还是要多做题,培养思维 对于这道题,来发现性质吧 对于每一条路线,因为它有用的就是最终的时刻,所以我们都可以把它变 ...
随机推荐
- 090 Subsets II 子集 II
给定一个可能包含重复整数的列表,返回所有可能的子集(幂集).注意事项:解决方案集不能包含重复的子集.例如,如果 nums = [1,2,2],答案为:[ [2], [1], [1,2,2], ...
- jQuery toggleClass 源码解读
toggleClass: function( value, stateVal ) { var type = typeof value;//值类型 if ( typeof stateVal === &q ...
- 回顾Quick Sort(Javascript 实现)
Introduction QuickSort的时间复杂度渐近函数虽然不能达到MergeSort般的O(nlgn),但因其良好的时间常量以及平均运行时间而被广泛使用. 下图解释了QuickSort的过程 ...
- jdk下载安装配置环境变量
因为学习原因要用到一些工具,jdk12的版本与那个工具不兼容,所以这里推荐使用的是jdk1.8的版本, 不知道是电脑原因还是啥原因,jdk 12的版本用不了配不好环境变量. 首先可以在官网下载jdk1 ...
- Json的详细用法
参考博客:https://www.cnblogs.com/haiyan123/p/7829080.html 1.json(Javascript Obiect Notation,JS对象标记)是一种 ...
- uvm.sv——UVM之道
文件: $UVM_HOME/src/uvm.sv 类: 无 `include "uvm_pkg.sv" Thus spake the UVM master programm ...
- freebsd自动获取ip地址
最小化安装完成freebsd后,ifconfig查看不到ip地址 修改/etc/rc.conf 添加ifconfig_网卡名称="DHCP" 重启服务器或者sh /etc/rc.c ...
- MySQL select * 和把所有的字段都列出来,哪个效率更高?
MySQL select * 和把所有的字段都列出来,哪个效率更高 答案是:如何,都不推荐使用 SELECT * FROM (1)SELECT *,需要数据库先 Query Table Metadat ...
- MySQL主从复制原理介绍
1)在mysql主库上,将改变记录到二进制日志(binary log)中. 2)在mysql从库上,IO线程将mysql主库上二进制日志(binary log)复制到中继日志(replay log)中 ...
- spring_boot入门
核心: 控制反转(Inversion of Control-IOC)和依赖注入(Dependency Injection-DI) Spring中两者是相同的, 控制反转是用依赖注入实现的. 这里, 依 ...