「HNOI2018」转盘
「HNOI2018」转盘
现场推出了大部分结论但是只写了 \(40\) 分暴力,被贺指导踩爆,现在还有点怀念 HNOI2018 贺指导对着镜子荒野行动的日子,那几天他云球迷瞎**指点篮球,被送上指导称号一个。
解题思路:
可以大力证明一定存在一种最优解只需要走一圈,假设存在一个最优解在某个时刻已经走了一圈回到出发点还剩下一些点没有被标记,那么最终还需要走到这些点标记一遍,这样的时间开销和在需要被标记的点之前等到它可以再走是等价的,所以一定存在一种最优解是在起始点等若干时刻然后一遍走完的。
于是可以把环倍长为 \(T_1,T_2\dots T_{2n}\) ,枚举一个起始点 \(1\leq s \leq n\) ,贡献就是
\\ ans = n-1+\min_{1\leq s \leq n}(s+\max_{s\leq i < s+n} (T_i-i))
\]
这个东西是所有长度为 \(n\) 的区间的贡献的 \(\min\) ,不太好维护,观察发现每一个区间后面的元素必然会小于区间内元素的 \(\max\) ,因为后面的元素都是倍长后没有被用到的 \(T_{i+n}\) ,显然 \(T_{i+n}-i-n<T_i-i\) 。
于是问题就转化为对于每一个后缀算贡献取 \(\min\) ,经典线段树维护单调栈求解即可。
具体来说,令 \(Ans(l,r)\) 为左端点在 \([l,mid]\) 的所有后缀贡献的 \(\min\) ,再维护一下区间 \(\max\) ,那么可以线段树二分找到 \(\max[mid+1,r]\) 在 \([l,mid]\) 中的位置 \(pos\) ,那么 \(pos\) 及以后的贡献是 \(pos+\max[mid+1,r]\) ,\(pos\) 之前的贡献就是那个节点原先的 \(Ans\) 。
这样搞一搞更新需要额外的一个 \(\log\) ,总时间复杂度 \(\mathcal O(n\log^2n)\) 。
code
/*program by mangoyang*/
#pragma GCC optimize("O2", "Ofast")
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 200005;
int t[N], n, m, p;
namespace Seg{
#define lson (u << 1)
#define rson (u << 1 | 1)
#define mid ((l + r) >> 1)
int mx[N<<2], s[N<<2];
inline int find(int u, int l, int r, int x){
if(l == r) return l + max(mx[u], x);
if(mx[rson] >= x)
return min(s[u], find(rson, mid + 1, r, x));
return min(mid + 1 + x, find(lson, l, mid, x));
}
inline void update(int u, int l, int r){
mx[u] = max(mx[lson], mx[rson]);
s[u] = find(lson, l, mid, mx[rson]);
}
inline void build(int u, int l, int r){
if(l == r) return (void) (mx[u] = t[l], s[u] = l + t[l]);
build(lson, l, mid), build(rson, mid + 1, r);
update(u, l, r);
}
inline void modify(int u, int l, int r, int pos, int x){
if(l == r) return (void) (mx[u] = x, s[u] = l + x);
if(pos <= mid) modify(lson, l, mid, pos, x);
else modify(rson, mid + 1, r, pos, x);
update(u, l, r);
}
}
int main(){
read(n), read(m), read(p);
for(int i = 1; i <= n; i++) read(t[i]);
for(int i = 1; i <= n; i++) t[i+n] = t[i];
for(int i = 1; i <= 2 * n; i++) t[i] -= i;
Seg::build(1, 1, 2 * n);
int lastans = Seg::s[1] + n - 1;
printf("%d\n", lastans);
for(int i = 1, x, y; i <= m; i++){
read(x), read(y), x ^= lastans * p, y ^= lastans * p;
Seg::modify(1, 1, 2 * n, x, y - x);
Seg::modify(1, 1, 2 * n, x + n, y - x - n);
printf("%d\n", lastans = Seg::s[1] + n - 1);
}
return 0;
}
「HNOI2018」转盘的更多相关文章
- Loj #2495. 「AHOI / HNOI2018」转盘
Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...
- 「AHOI / HNOI2018」转盘 解题报告
「AHOI / HNOI2018」转盘 可能是我语文水平不太行... 首先可以猜到一些事实,这个策略一定可以被一个式子表示出来,不然带修修改个锤子. 然后我们发现,可以枚举起点,然后直接往前走,如果要 ...
- 「HNOI2018」毒瘤
「HNOI2018」毒瘤 解题思路 先考虑只有一棵树的情况,经典独立集计数. \[ dp[u][0]=\prod (dp[v][0]+dp[v][1]) \\ dp[u][1]=\prod dp[v] ...
- 「HNOI2018」游戏
「HNOI2018」游戏 解题思路 首先没有锁上的门可以缩点缩掉,然后对于一扇锁上的门,如果钥匙在左边,那么右边就永远不可能到达左边,同理如果钥匙在右边,左边就永远不可能到达右边. 然后考虑一个暴力的 ...
- 【LOJ】#2495. 「AHOI / HNOI2018」转盘
题面 题解 考虑我肯定是从一个人出发,开始依次标记,而不会跳过某个人,因为如果我跳过了,那么我之后回来还需要标记它,比不上我等完它再一直走到最后(因为多了走一圈之后走回它的代价) 我们倍长整个序列,我 ...
- Loj #2494. 「AHOI / HNOI2018」寻宝游戏
Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...
- loj #2510. 「AHOI / HNOI2018」道路
#2510. 「AHOI / HNOI2018」道路 题目描述 W 国的交通呈一棵树的形状.W 国一共有 n−1 个城市和 nnn 个乡村,其中城市从 111 到 n−1 编号,乡村从 111 到 n ...
- loj #2509. 「AHOI / HNOI2018」排列
#2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...
- loj #2508. 「AHOI / HNOI2018」游戏
#2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...
随机推荐
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
- AS中一些不经常用到的快捷键
1 书签 添加/移除书签 Ctrl+shift+F11 展示书签 shift+F11 下一个书签 shift+加号 上一个书签 shift+减号 2 折叠/展开代码块 展开代码块 ctrl+加号 ...
- TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...
了解TCP协议端口的连接状态,对排除和定位网络或系统故障会有很大帮助,因此了解一下是有必要的: 一.LISTENING 提供某种服务,侦听远方TCP端口的连接请求,当提供的服务没有被连接时,处于LI ...
- 【前端vue开发】vue单页应用添加百度统计
前言 申请百度统计后,会得到一段JS代码,需要插入到每个网页中去,在Vue.js项目首先想到的可能就是,把统计代码插入到index.html入口文件中,这样就全局插入,每个页面就都有了;这样做就涉及到 ...
- ASP .Net Core系统部署到Ubuntu 16.04 具体方案
.Net Core 部署到Ubuntu 16.04 中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务 ...
- TDictionary 与 TObjectDictionary
TDictionary 与 TObjectDictionary 的区别是 : TObjectDictionary 可以做到 free的时候 里面的对象 一并free,从而不会出现内存 泄露. 用途: ...
- 20165333实验一 JAVA开发环境的熟悉
JAVA开发环境的熟悉-1 1建立"自己学号exp1"的目录 2 在"自己学号exp1"目录下建立src,bin等目录 3 javac,java的执行在&quo ...
- 20165333 2016-2017-2 《Java程序设计》第1周学习总结
20165333 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 java 的地位 Java 的特点 安装JDK 系统环境的设置 Java程序的编写,编译和运 ...
- CCF CSP 201609-4 交通规划
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-4 交通规划 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自 ...
- 【LOJ】#2205. 「HNOI2014」画框
题解 我原来根本不会KM 更新每个节点增加的最小值的时候,要忽略那个方访问过的右节点!!! 然后就和最小乘积生成树一样了 代码 #include <iostream> #include & ...