「AHOI / HNOI2018」转盘

可能是我语文水平不太行...


首先可以猜到一些事实,这个策略一定可以被一个式子表示出来,不然带修修改个锤子。

然后我们发现,可以枚举起点,然后直接往前走,如果要等就等到它出现。

因为如果不等,一定要走超过一圈,这样一定不如从它后面那个点当起点。

既然要等,不如我们就在起点等了,显然这样的等价的,于是我们可以搞出这个式子了。

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

这里我们把\(S\)倍长了

稍微放缩一下并扔掉不重要的东西,我们要维护的大概是这个东西

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

我们每次修改\(T_j\),然后询问这个式子的值

考虑对\(j\)枚举\(i\),有一些事实是

如果\(T_{p_1},T_{p_2},T_{p_3},\dots,T_{p_k}\)是\(T\)的后缀最大值集合

我们的答案就是

\[\min_{i=1}^kT_i+p_{i-1}+1
\]

后缀最大值可以以单调栈的形式表示出来

考虑在线段树上维护

比如说,我们可以

我们每个节点维护一个右儿子最大值与左儿子整个后缀最大值集合连接成的答案集合。

有点抽象,举个例子就是

比如有这样的\(T\)值

左儿子:5 4 3 1 右儿子:2 1 0

那么这个信息就是5 4 3 2这个集合的答案

也不一定非要这样,但是这样蛮方便的

维护这个信息得去左儿子上二分,所以这样是\(\log^2 n\)的

这个题,你发现,\(2n\)的区间中,右儿子内部不能产生贡献(因为式子中\(\min\)的枚举范围是\(1\sim n\)的)

所以维护一下长为\(n\)的区间的答案,每次询问的时候在\((n+1)\sim 2n\)里面找个最大值去问就可以了,注意到这个东西它可以从\(1\sim n\)的最大值里面获得


Code:

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
using std::min;
using std::max;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
int f=0;x=0;char c=gc();
while(!isdigit(c)) f|=c=='-',c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
if(f) x=-x;
}
const int N=2e5+10;
const int inf=0x3f3f3f3f;
int n,m,p,t[N];
int mx[N<<2],yuu[N<<2];
#define ls id<<1
#define rs id<<1|1
int qry(int id,int l,int r,int d)
{
if(l==r) return mx[id]>d?d+l:inf;
int mid=l+r>>1;
if(mx[rs]>d) return min(yuu[id],qry(rs,mid+1,r,d));
else return qry(ls,l,mid,d);
}
void updata(int id,int l,int r)
{
mx[id]=max(mx[ls],mx[rs]);
yuu[id]=qry(ls,l,l+r>>1,mx[rs]);
}
void upd(int id,int l,int r,int p,int d)
{
if(l==r)
{
mx[id]=d;
return;
}
int mid=l+r>>1;
if(p<=mid) upd(ls,l,mid,p,d);
else upd(rs,mid+1,r,p,d);
updata(id,l,r);
}
void build(int id,int l,int r)
{
if(l==r)
{
mx[id]=t[l];
yuu[id]=inf;
return;
}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
updata(id,l,r);
}
int main()
{
read(n),read(m),read(p);
for(int i=1;i<=n;i++) read(t[i]),t[i]-=i;
build(1,1,n);
int ans=qry(1,1,n,mx[1]-n)+n;
printf("%d\n",ans);
for(int x,y,i=1;i<=m;i++)
{
read(x),read(y);
if(p) x^=ans,y^=ans;
upd(1,1,n,x,y-x);
printf("%d\n",ans=qry(1,1,n,mx[1]-n)+n);
}
return 0;
}

2019.5.21

「AHOI / HNOI2018」转盘 解题报告的更多相关文章

  1. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

  2. 【LOJ】#2495. 「AHOI / HNOI2018」转盘

    题面 题解 考虑我肯定是从一个人出发,开始依次标记,而不会跳过某个人,因为如果我跳过了,那么我之后回来还需要标记它,比不上我等完它再一直走到最后(因为多了走一圈之后走回它的代价) 我们倍长整个序列,我 ...

  3. Loj #2494. 「AHOI / HNOI2018」寻宝游戏

    Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...

  4. loj #2510. 「AHOI / HNOI2018」道路

    #2510. 「AHOI / HNOI2018」道路 题目描述 W 国的交通呈一棵树的形状.W 国一共有 n−1 个城市和 nnn 个乡村,其中城市从 111 到 n−1 编号,乡村从 111 到 n ...

  5. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  6. loj #2508. 「AHOI / HNOI2018」游戏

    #2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...

  7. @loj - 2496@ 「AHOI / HNOI2018」毒瘤

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的 ...

  8. loj#2509. 「AHOI / HNOI2018」排列(思维题 set)

    题意 题目链接 Sol 神仙题Orz 首先不难看出如果我们从\(a_i\)向\(i\)连一条边,我们会得到以\(0\)为根的树(因为每个点一定都有一个入度,出现环说明无解),同时在进行排列的时候需要保 ...

  9. loj#2510. 「AHOI / HNOI2018」道路 记忆化,dp

    题目链接 https://loj.ac/problem/2510 思路 f[i][a][b]表示到i时,公路个数a,铁路个数b 记忆化 复杂度=状态数=\(nlog^2n\) 代码 #include ...

随机推荐

  1. 【leetcode】995. Minimum Number of K Consecutive Bit Flips

    题目如下: In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) suba ...

  2. js instanceof和typeof的区别及简单用法

    js中判断一个变量的类型,通常的做法是用typeof方法,看它返回的是 什么,但是对于数组和对象它返回的都是object,ECMAScript引入了java中的instanceof 方法来弥补这一缺陷 ...

  3. windows环境下安装pymysql(操作带图)

    在windows环境下安装pymysql,首先要找到python的安装位置,如果在c盘,启动cmd的时候,要获取管理员权限. 具体步骤,一,管理员模式启动cmd.在箭头指定位置,搜索cmd,出现快捷方 ...

  4. Hive 时间操作函数(转)

    1.日期函数UNIX时间戳转日期函数: from_unixtime 语法:   from_unixtime(bigint unixtime[, string format]) 返回值: string ...

  5. 漫谈C语言结构体

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...

  6. HTML5: HTML5 应用程序缓存

    ylbtech-HTML5: HTML5 应用程序缓存 1.返回顶部 1. HTML5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线 ...

  7. Oracle 用户概念与基本操作

    目录 目录 Oracle的用户 通过系统用户来登陆SQLPlus system和sys的区别 查看登陆的用户 启用和锁定一个用户 启用用户 锁定用户 创建用户 修改用户 删除用户 角色权限 常用的用户 ...

  8. oraToolKit Oracle安装辅助工具的使用方法

    目录 目录 otk使用方式 使用oraToolKit进行检测安装包情况 使用oraToolKit进行检测操作系统情况 最后 otk使用方式 oraToolkit的安装在RHEL6.1 安装 Oracl ...

  9. HP Server BIOS实验报告

    原文链接http://www.hpiss.com/3924.html 注意:红色字体为HP手册中查找到的资源,及个人感觉应该注意的一些信息,个人翻译的也为红字体,网络中自行查找到的资源,以及询问各位师 ...

  10. 14. Django MTV及Django模型

    MTV 我们或许都听说过MVC模式.MVC是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码.Django ...