「AHOI / HNOI2018」转盘 解题报告
「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
转载于:https://www.cnblogs.com/butterflydew/p/10902479.html
「AHOI / HNOI2018」转盘 解题报告相关推荐
- loj 2495. 「AHOI / HNOI2018」转盘
题意: 在一个环形转盘上,第iii个物品将在Ti" role="presentation" style="position: relative;"&g ...
- loj #2509. 「AHOI / HNOI2018」排列
#2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,-,an(0≤ai≤n),以及 nnn 个整数 w1,w2,-,wn.称 a1,a2,-,an 的一个 ...
- LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告
LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告 好苹果会组成连通块,整棵树的权值为 ∑ i = 1 n c i [ c i ≥ 0 ] [ s i z n u m ( c i ...
- 「AHOI / HNOI2017」影魔
「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...
- 「足记」产品体验报告
「足记」产品体验报告 前段时间图片社交产品领域诞生了一款新贵--足记.足记在2.1.4版本,加入了横向宽屏拍摄.添加中英文字幕--即"大片模式".正是这次更新,让这款app ...
- 「HAOI2018」染色 解题报告
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...
- 「2019 集训队互测 Day 1」最短路径 解题报告
一.题目概述 题目链接:Libre OJ. 给出一张图,求出 ans=∑i=1n∑j=1n[i≠j]dk(i,j)ans=\sum_{i=1}^n\sum_{j=1}^n[i\ne j]\texttt ...
- 「UVA1328」Period 解题报告
English题面 题意: 给你一个长度为n的字符串,依次取字符串前i个(前缀),如果前缀由k(k>0)个相同真子串构成,那么输出i和k 直到n为0结束,每组数据后要有一行空白 思路: KMP+ ...
- 【扩展lucas】LOJ#2023. 「AHOI / HNOI2017」抛硬币
Description 抛硬币,小A投 a a a次,小B投 b b b次,求小A正面次数多于小B正面次数的方案数. 1 ≤ a , b ≤ 1 e 15 , 0 ≤ a − b ≤ 1 e 4 , ...
最新文章
- Caffe:导入caffePython-PyQt failed
- ApiBoot - ApiBoot Swagger 使用文档
- 若依实现文件多线程批量上传案例
- android 颜色0x00,Android 状态栏颜色兼容方案
- html找不到定义,Main无法正常使用,找不到它的定义
- openwrt搭建环境
- Java代码编程格式规范
- cad延伸命令怎么用_原来我们都用错了CAD直线命令,你不能忽视的CAD直线绘制技巧详解...
- AI之路最近的一些思考
- EfficientNetV2网络详解
- JAVA并发编程-视频教程
- 设计模式(十):模板方法模式
- Java集合详解6:TreeMap和红黑树
- 基金申请-2:期刊如何批量索引SCIE、EI、ISTP (CPCI)?
- Git 常用命令练习
- 支付FM——支付宝收款码配置
- SAP MASS批量更新(Mass Maintenance)工具对象类型介绍
- PHP仿百度网盘文件分享dzzoffice网盘系统源码
- android 模仿微信读书,Flutter 模仿微信读书实现案例
- linux字符设备和块设备的区别 以及网络设备