[HNOI/AHOI2018]转盘(线段树优化单调)
[HNOI/AHOI2018]转盘(线段树优化单调)
lei了lei了,事独流体毒瘤题
一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动
问实现每一个点都在$T_i$之后被访问到的最短时间
Step 1
该题可证:
最优方案必然是从某一格开始后一直等着然后走一圈正好全部访问到
证明:
如果时间倒流那就是从时刻T开始每一时刻向前走或是停着不动,每个元素过了T[i]会消失
如果这样的话你肯定是马不停蹄往前走对吧
所以反过来就是上面的结论
Q.E.D
上面的结论还有其他正确的表示方法,该方法仅供参考
如果您能想出其他证明,那么请让我Orz您
Step 2
根据上述结论,答案出来了$min_{i=1}^{n}(\max_{j=i}^{i+n-1}(T_j-j+i))+n-1$
暴力胡写都有$n^2$20分,可惜我考场上直接放弃
介个是用线段树优化的说...
简单思路:$T_j-j$可以单独提出来设为$f_j$
原式可变成$\min_{i=1}^{n}(\max_{j=i}^{i+n-1}(f_j)+i)+n-1$
做这道题之前我也没见过log的pushup
随手找了点参考文献(???)[luoguP4198]楼房重建
事实上并没有什么关系,但是确实十分相似
线段树维护方法都是差不多的,随便yy应该就差不多
代码:
#include<cstdio>
#include<algorithm>
using std::max;
using std::min;
const int N=;
int n,T,plas;
int v[N],f[N];
struct segtree
{
int ma[N<<],ans[N<<];
int query(int vi,int px,int pl,int pr)
{
if(pl==pr) return pl+max(ma[px],vi);
int mid=(pl+pr)>>;
if(ma[px<<|]>vi) return min(ans[px],query(vi,px<<|,mid+,pr));
else return min(mid++vi,query(vi,px<<,pl,mid));
}
void fuckup(int px,int pl,int pr)
{
ma[px]=max(ma[px<<],ma[px<<|]);
ans[px]=query(ma[px<<|],px<<,pl,(pl+pr)>>);
}
void add(int x,int px,int pl,int pr)
{
if(pl==pr)
{
ma[px]=f[x],ans[px]=v[x];
return;
}
int mid=(pl+pr)>>;
if(x<=mid) add(x,px<<,pl,mid);
else add(x,px<<|,mid+,pr);
fuckup(px,pl,pr);
}
int get()
{
return ans[]+n-;
}
}rk;
int xin,vin; int lastans;
int main()
{
scanf("%d%d%d",&n,&T,&plas);
for(int i=;i<=n;i++) scanf("%d",&v[i]),v[i+n]=v[i],f[i]=v[i]-i,f[i+n]=v[i+n]-i-n;
for(int i=;i<=n<<;i++) rk.add(i,,,n<<);
lastans=rk.get();
printf("%d\n",lastans);
if(!plas) lastans=;
while(T--)
{
scanf("%d%d",&xin,&vin);
xin^=lastans,vin^=lastans;
v[xin]=vin,v[xin+n]=vin,f[xin]=v[xin]-xin,f[xin+n]=v[xin+n]-xin-n;
rk.add(xin,,,n<<),rk.add(xin+n,,,n<<);
lastans=rk.get();
printf("%d\n",lastans);
if(!plas) lastans=;
}
return ;
}
巨佬您txdy
[HNOI/AHOI2018]转盘(线段树优化单调)的更多相关文章
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- 完美字符子串 单调队列预处理+DP线段树优化
题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...
- bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
- [NOI2016]区间 题解(决策单调性+线段树优化)
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1593 Solved: 869[Submit][Status][ ...
- HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...
- 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
- Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)
Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...
- Weak Pair---hud5877大连网选(线段树优化+dfs)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 题意:给你一颗树,有n个节点,每个节点都有一个权值v[i]:现在求有多少对(u,v ...
随机推荐
- CollabNetSubversionEdge 4.0.4教程
CollabNetSubversionEdge是svn的集成环境,集合subversion,apache,viewvc, 参考网址:http://blog.miniasp.com/post/2011/ ...
- Javaweb的9大内置对象
request(请求) response(响应) session(一个用户存放数据,安全) application(一个项目一般有一个,多用户共享存简单数据) out(输出,在页面输出内容) conf ...
- bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】
https://blog.sengxian.com/solutions/bzoj-1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因 ...
- bzoj 3979: [WF2012]infiltration【瞎搞+随机化】
参考:https://www.cnblogs.com/ccz181078/p/5622200.html 非常服气.jpg 就是random_shuffle几次然后顺着找,ans取min... #inc ...
- 洛谷P3569 [POI2014]KAR-Cards(线段树)
传送门 蠢了…… 我们用线段树,记$w0$为该区间最左端取小值时,最右端最小能取大还是小还是无解,$w1$表示最左端取大值时,最右端最小能取大还是小还是无解 然后只要把交换看做修改就好了 这么说可能很 ...
- CF915E Physical Education Lessons(珂朵莉树)
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...
- UVA - 10859 Placing Lampposts 放置街灯
Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...
- VS 2017 产品密钥
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QFVisual Studio 2017(VS2017 ...
- flask请求访问数据
flask请求访问数据 在flask框架中,访问请求数据由全局的request对象来提供,在flask框架中,request对象具有 全局作用域: from flask import request ...
- CMake学习笔记二:cmake 常用变量和常用环境变量
1 cmake 变量引用的方式 使用 ${} 进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过 ${} 取值. 2 cmake 自定义变量的方式 主要有隐式定义和显式定义两种,举一个隐式定 ...