「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. C变量

    C 变量 变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下 ...

  2. cf round#598 CDEF

    C:模拟:未跳到目的地之前先贪心放板子,能到达目的地后紧贴着放板子 先判能不能跳到目的地,能跳到再考虑是否需要将后面的板子往前移动 #include<bits/stdc++.h> usin ...

  3. CDN技术之--该技术概述

    CDN关键技术:1. 缓存算法[Squid]:2. 分发能力:3. 负载均衡[Nginx](4. 基于DNS[BIND]):5. 支持协议: 缓存算法决定命中率.源服务器压力.POP节点存储能力分发能 ...

  4. Github上的SlidingMenu菜单的使用方法

    GitHub上的SlidingMenu的配置方法 1. 首先明确SlidingMenu是什么? 2. 如何使用SlidingMenu框架呢? GitHub上的SlidingMenu的配置方法 1. 首 ...

  5. SpringMVC·form表单Date类型问题导致的400问题

    问题描述 前端传yyyy-MM-dd hh:mm:ss格式的时间其实是String类型导致JavaBean中的Date类型Setter报错,从而导致api请求400. 问题解决 我的解决方式: 在对应 ...

  6. Procedure or function 'pu_usr_User' expects parameter '@WhiteIp', which was not supplied.

    遇到这个问题,是因为存储过程的参数,设置默认值写错了. 错误写法 @WhiteIp NVARCHAR(MAX) NULL, Stored procedure with default paramete ...

  7. USB编程概念

     RE:USB编程概念 >请你指导我如何学习USB虚拟COM端口PROGRAMM,什么是我们needto有(如硬件和软件)的东西. USB是一个典型的复杂的协议栈,在协议的协议.这是很难完全实现 ...

  8. 大数据和AI怎么与现代教育相结合?

    大数据和AI怎么与现代教育相结合? 比尔·盖茨曾预言,"5年以后,你将可以在网上免费获取世界上最好的课程,而且这些课程比任何一个单独大学提供的课程都要好." 现在看来,虽然并不是每 ...

  9. upc组队赛6 Bumped!【最短路】

    Bumped! 题目描述 Peter returned from the recently held ACM ICPC World finals only to find that his retur ...

  10. layui 下拉框 动态获取数据

    $(function(){var grade=$("#grade");grade.append("一年级"); //添加下拉列表grade.append(&qu ...