bzoj 5286: [Hnoi2018]转盘
Description

Solution
首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长
那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)),j∈[i,2*n]\)
相当于从 \(i\) 出发,先走到 \(j\) 停下来,然后再走完剩下的,如果不合法则不会更优
最优情况一定是把等待时间尽量用在前面(把起点往前移)
设 \(a[i]=T[i]-i\)
原式变为: \(min(max(a[j]+i)+n-1),j∈[i,2*n]\)
维护 \(max(a[j]+i)\) 即可,可以用线段树维护,每一次修改向上合并维护这个东西
\(i,j\) 是有偏序关系的每一次要维护跨过 \(mid\) 的答案
向上合并需要一个 \(log\) 的递归查询
复杂度是 \(O(n*log^2)\)
#include<bits/stdc++.h>
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
const int N=2e5+10;
int n,tr[N*4],mx[N*4],Q,P,T[N],a[N],ans=0;
inline int qry(int l,int r,int o,int x){
if(l==r)return l+max(x,mx[o]);
int mid=(l+r)>>1;
if(mx[rs]>=x)return min(tr[o],qry(mid+1,r,rs,x));
return min(qry(l,mid,ls,x),mid+1+x);
}
inline void upd(int l,int r,int o){
int mid=(l+r)>>1;
tr[o]=qry(l,mid,ls,mx[rs]);
mx[o]=max(mx[ls],mx[rs]);
}
inline void build(int l,int r,int o){
if(l==r){tr[o]=T[l];mx[o]=a[l];return ;}
int mid=(l+r)>>1;
build(l,mid,ls);build(mid+1,r,rs);
upd(l,r,o);
}
inline void Modify(int l,int r,int o,int sa){
if(l==r){tr[o]=T[l];mx[o]=a[l];return ;}
int mid=(l+r)>>1;
if(sa<=mid)Modify(l,mid,ls,sa);
else Modify(mid+1,r,rs,sa);
upd(l,r,o);
}
int main(){
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
cin>>n>>Q>>P;
for(int i=1;i<=n;i++){
scanf("%d",&T[i]);T[i+n]=T[i];
a[i]=T[i]-i;a[i+n]=T[i+n]-i-n;
}
build(1,n*2,1);
printf("%d\n",ans=tr[1]+n-1);
int x,y;
while(Q--){
scanf("%d%d",&x,&y);x^=ans*P;y^=ans*P;
T[x]=y;T[x+n]=y;a[x]=T[x]-x;a[x+n]=T[x+n]-x-n;
Modify(1,n*2,1,x);Modify(1,n*2,1,x+n);
printf("%d\n",ans=tr[1]+n-1);
}
return 0;
}
bzoj 5286: [Hnoi2018]转盘的更多相关文章
- 5286: [Hnoi2018]转盘
5286: [Hnoi2018]转盘 链接 分析: $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{i + n - 1} \{ a_{j}+i \} \} +n- ...
- [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 15 Solved: 11[Submit][Status][Di ...
- 【BZOJ5286】[HNOI2018]转盘(线段树)
[BZOJ5286][HNOI2018]转盘(线段树) 题面 BZOJ 洛谷 题解 很妙的一道题目啊.(全世界除了我这题都有40分,就我是一个状压选手 首先来发现一些性质,我们走一圈一定不会更差. 为 ...
- [HNOI2018]转盘
[HNOI2018]转盘 给你一个 \(n\) 元环, 你可以在 \(0\) 时刻从任意一个位置出发, 每一秒可以选择往后或者留在原地每个点有个参数 \(T_i\) , 当你走到 \(i\) 的时间 ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- BZOJ5286: [Hnoi2018]转盘 (线段树)
题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...
- bzoj 5287: [Hnoi2018]毒瘤
Description Solution \(dfs\) 出一棵生成树之后,多出来的边就都是反祖边了 把反祖边两个端点都拿出来,就会得到最多 \(k=2*(m-n+1)\) 个关键点 除了关键点以外的 ...
- bzoj 5285: [Hnoi2018]寻宝游戏
Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...
- bzoj 5289: [Hnoi2018]排列
Description Solution 首先注意到实际上约束关系构成了一棵树 考虑这个排列 \(p\),编号为 \(a[i]\) 的出现了,\(i\) 才可以出现 那么如果连边 \((a[i],i) ...
随机推荐
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- 20162330 第十二周 蓝墨云班课 hash
题目要求 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85,75,57,60,65,(你的8位学号 ...
- Beta冲刺第三天
一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:修改权限相关的资源表示,修复flex布局排版高度问题,修复文件更新问题,去除登录页面的默认账号密码,服务器部署. 2.黄腾达:修复日程首次执行时间 ...
- Beta冲刺计划---Day0
Beta阶段报告---Day0 1.需要改进完善的功能 我们上一阶段开发由于开发时间匆忙,对于爬虫耗时的优化没有考虑.优化的空间我在Alpha阶段的总结报告里说过,具体看下图. 这张图显示出爱 ...
- 数据结构基础——结构体struct及类型别名typedef的使用
一.结构体的创建 在C语言中,实现数据结构的一种常用方法便是使用结构体(structure)其示例代码如下: struct stu { int num; char ch; }; struct表示创建结 ...
- 库函数atoi
函数名:atoi 功能: 把一个字符串转换成一个整数. 看似简单,主要是情况太多,需要注意考虑. 测试代码: Test(NULL); Test(""); Test("12 ...
- Tornado 用户身份验证框架
1.安全cookie机制 import tornado.web session_id = 1 class MainHandler(tornado.web.RequestHandler): def ge ...
- 使用XIB实现嵌套自定义视图
在进行iOS开发的过程中,对于一些复杂的界面,我们可以通过Interface Builder这个Xcode集成的可视化界面编辑工具在完成,这回节省大部分时间以及代码量.它的使用方法这里不做介绍了,这次 ...
- Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- Android Notification setLatestEventInfo方法已废弃
代替setLatestEventInfo的方法是用Notification.Builder创建Builder对象,通过该对象设置Notification相关属性. otification.Builde ...