「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. Mysql学习笔记(003)-案例讲解基础查询

    案例讲解基础查询 #.下面的语句是否可以执行成功 SELECT last_name, first_name, salary AS sal FROM employees; #.下面的语句是否可以执行成功 ...

  2. LCD驱动程序架构和分析

    一.LCD驱动程序架构 1.裸机驱动代码分析 ①LCD初始化:控制器初始化,端口初始化,指明帧缓冲 ②LCD图形显示:将图形数据写入帧缓冲 void lcd_init() { lcd_port_ini ...

  3. jdbc 事物

    package transaction; import jdbc.utils.*; import java.sql.Connection; import java.sql.PreparedStatem ...

  4. SLA(服务等级协议)

    SLA:Service-Level Agreement的缩写,意思是服务等级协议.是关于网络服务供应商和客户间的一份合同,其中定义了服务类型.服务质量和客户付款等术语. 定义SLA:Service-L ...

  5. 树状数组,Fenwick Tree

    Fenwick Tree, (also known as Binary Indexed Tree,二叉索引树), is a high-performance data structure to cal ...

  6. JdbcTemplate 的oracle分页

    @Autowired private JdbcTemplate jd; int ps1=Integer.valueOf(pageSize); int cp1=Integer.valueOf(currP ...

  7. python学习笔记:模块——time模块

    timetime模块提供各种时间相关的功能,与时间相关的模块有:time,datetime,calendar等. 时间有三种表示方式,一种是时间戳.一种是格式化时间.一种是时间元组.时间戳和格式化时间 ...

  8. css篇-简化版

    [CSS篇]简化版 (1)     CSS盒模型 CSS盒模型 题目:谈谈你对CSS盒模型的认识 1)       基本概念:标准模型+IE模型 2)       标准模型和IE模型的区别 计算宽度和 ...

  9. python_模块 collections,random

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  10. CF1216X

    由于rating限制,和慎老师用小号打了一场div 3 从A到F都没啥思维含量..感觉最难想的就是C了?? CF1216C 考完以后想hack一下这道题,然后发现满屏都是分类讨论 我大概是写不动 or ...