题目描述:

bz

luogu

题解:

看了半个晚上终于明白了。

首先最优决策一定有:在起始点停留一段时间然后一直前进。

解释网上有很多,在这里不赘述了。

(由于是环,先把$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]转盘的更多相关文章

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

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

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

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

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

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

  4. 5286: [Hnoi2018]转盘

    5286: [Hnoi2018]转盘 链接 分析: $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{i + n - 1} \{ a_{j}+i \} \} +n- ...

  5. [HNOI2018]转盘

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

  6. bzoj 5286: [Hnoi2018]转盘

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

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

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

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

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

  9. 【比赛】HNOI2018 转盘

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

随机推荐

  1. windows 修改鼠标滚轮自然滚动

    在mac 上玩习惯了,使用windows 时的鼠标实在觉得别扭,在网上百度了一下,找到一个方法,这里记录一下 1 打开windows 的控制面板,点击“硬件和声音” 2 点击“鼠标” 3 然后点击上面 ...

  2. shell chpasswd 命令 修改用户密码

    使用useradd 命令增加一个用户后,它默认是没有设置密码的.如果需要给用户设置或者修改密码,一般会使用passwd命名. 但是passwd命令有一个缺陷,它需要人工交互操作. 如果你是一名系统管理 ...

  3. C 语言实例 - 字符串翻转

    C 语言实例 - 字符串翻转 C 语言实例 C 语言实例 使用递归来翻转字符串. 实例 - 字符串翻转 #include <stdio.h> void reverseSentence(); ...

  4. mybits like查询写法

    1.mysql :LIKE CONCAT('%',#{empname},'%' ) 或者 LIKE CONCAT('%',‘${empname}’,'%' ) 2.oracle:LIKE '%'||# ...

  5. bzoj1339/1163:[Baltic2008]Mafia

    传送门 最小割,割点,模板... 代码: #include<cstdio> #include<iostream> #include<algorithm> #incl ...

  6. [android][avd位置修改][需自己手动]

    1.找到avd目录(C:\的那个)并打开,移动.avd文件到需要的位置. 2.修改ini文件path,完成.

  7. JSP新闻发布系统

    1.主页面 1.1登录 1.2    分页 2.注销 3.代码如下 package cn.news.dao.impl; import java.sql.SQLException; import org ...

  8. Idea安装以及破解

    软件安装包和破解工具安装包 链接 链接:https://pan.baidu.com/s/1TpCiaSsAz_I9gXyOnwKK9g 密码:qc49 1.下载完Idea工具后,点击.exe文件,进行 ...

  9. ajax学习和总结

    Jquery AJAX http://www.cnblogs.com/jayleke/archive/2012/08/10/2633174.html http://www.php100.com/htm ...

  10. thinkphp分页集成

    控制器: $User = M('webcase'); //  实例化 User 对象 $list = $User->order('id desc')->page($_GET['p'].', ...