「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. Delphi 字符串函数SysUtils单元 AnsiSameStr、AnsiSameText、AnsiCompareStr、AnsiCompareText、AnsiCompareFileName、AnsiUpperCase、AnsiLowerCase、AnsiUpperCaseFileName、AnsiLowerCaseFileName、AnsiPos、AnsiQuotedStr

    USES 单元 SysUtils 非 StrUtils AnsiSameStr.AnsiSameText.AnsiCompareStr.AnsiCompareText.AnsiCompareFileN ...

  2. dependency与dependencyManagement区别

    在maven的pom文件中,有时候会见到dependencyManagement,它与denpendency有什么区别? 比方说,你在一个parent的pom里把你所需要的依赖包,版本号都写在depe ...

  3. cf round#598 CDEF

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

  4. 分布式系统理论基础6:Raft、Zab

    本文转自:https://www.cnblogs.com/bangerlee/p/5991417.html 本文转自 https://www.cnblogs.com/bangerlee/p/52684 ...

  5. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】03、创建RESTful API,并统一处理返回值

    本节应用Spring对RESTful的支持,使用了如@RestController等注解实现RESTful控制器. 如果对Spring中的RESTful不太明白,请查看相关书籍 1.创建一个数据对象, ...

  6. python学习笔记:目录结构

    "项目目录结构"其实也是属于"可读性和可维护性"的范畴. 目录组织方式 关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构.在Sta ...

  7. PAT甲级——A1149DangerousGoodsPackaging【25】

    When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...

  8. [ERR] 153 - Got a packet bigger than 'max_allowed_packet' bytes

    异常原因: 用客户端导入数据的时候,信息包过大 ,终止了数据导入,需要修改max_allowed_packet 参数 解决方案: 1. sql语句修改( ⚠️重启服务设置会失效) 登陆mysql查看当 ...

  9. 04、python的基础-->列表跟元组

    一.列表list 1.列表的新增元素(三种方法) >>>第1种方法(append 增加到最后): li = ['Peter','Henrry','Wode','鸭子','xiaoxi ...

  10. 洛谷P1629 邮递员送信 最短路-Djistra

    先上一波题目qwq https://www.luogu.org/problem/P1629· 复习了一波 dijstra 的 priority_queue(优先队列)优化的写法 tips: 求单项路中 ...