Solution -「CF1373G」Pawns
小清新线段树题((
每个位置的边只能向靠右的三个方向走,最后要走到一条基准线上。即对于一个点 \((x, y)\),它最后应该落在 \((k, y + |k - x|)\)。
士兵可以一个一个进行移动,所以互相的移动行程不会互相干扰。考虑利用这个性质将题目从二维转换为一维。
即:有一队士兵排好队,每个士兵有一个预选定的位置。当轮到第 \(i\) 位士兵选位置时,若预选定位置有其它士兵,则选择当前选定位置右边紧挨着的位置,直到当前选定位置上不再有其他士兵后站入该位置。试问至少需要新加入多少个格子可以收容所有士兵。
盲目感觉这种“当前放不了就考虑下一个”的题目常常会考虑维护一些后缀,所以接下来我们引入后缀。
如果构造一个数组 \(A\),且初始时 \(\forall A_i = -1 \space \mathrm{s.t.} i \in [1, n]\)。且定义数组 \(f\),表示有 \(f_i\) 个士兵预选定了 \(i\) 这个位置。则答案为序列 \(A + f\) 的后缀和最大值。(建议自己手 Rua 一下。
但对于 \(i > n\) 的部分,这样是不好处理的。因为在原题中,这些位置也应该参与到“新加入位置”的贡献中。于是更改 \(A\) 的构造方式。
在 \(i \in [1, n]\) 的部分,我们直接令 \(A_i = -(n - i + 1)\),即直接储存后缀。
而 \(i > n\) 的部分,我们尝试分析其贡献。如果要使用 \(n + 2\) 这个位置,则我们需要先添加一个 \(n + 1\) 的位置,也就是第 \(n + 2\) 项初值应该为 \(1\)。同理可知 \(n + 1 \dots n + n\) 等位置,故也可令 \(i > n\) 的部分中 \(A_i = -(n - i + 1)\)。
不难发现,现在答案为 \(\max \{ A_i + g_i \} \space \mathrm{s.t.} i \in [1, w]\),其中 \(w\) 是预选定位置最靠右的一个,\(g\) 是 \(f\) 的后缀序列。
\(f\) 是动态更新的,每次更新会先区间修改 \(g\),最终作用于 \(A + f\)。故 \(A + g\) 可以直接使用区修区查的线段树维护。\(w\) 使用 set
,加一个计数器维护即可。
总时间复杂度 \(O(n \log n)\)。这里使用的是常数较小的 zkw 线段树。
#include <map>
#include <set>
#include <cstdio>
using namespace std;
int Abs (int x) { return x < 0 ? -x : x; }
int Max (int x, int y) { return x > y ? x : y; }
int Min (int x, int y) { return x < y ? x : y; }
int Read () {
int x = 0, k = 1;
char s = getchar ();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar ();
}
while ('0' <= s && s <= '9')
x = (x << 3) + (x << 1) + (s ^ 48), s = getchar ();
return x * k;
}
void Write (int x) {
if (x < 0)
putchar ('-'), x = -x;
if (x > 9)
Write (x / 10);
putchar (x % 10 + '0');
}
void Print (int x, char s) { Write (x), putchar (s); }
const int Inf = 1e9;
const int Maxn = 4e5 + 5;
set <int> s;
map <int, int> Vis[Maxn];
int a[Maxn], Tr[Maxn * 3], Lazy[Maxn * 3], Cnt[Maxn], p;
void Make_Tree (int n) {
p = 1;
while (p < n + 2)
p <<= 1;
Tr[p + n + 1] = Tr[p] = -Inf;
for (int i = 1; i <= n; i++)
Tr[p + i] = a[i];
for (int i = p + n + 1; i > 1; i--)
Tr[i >> 1] = Max (Tr[i], Tr[i ^ 1]);
}
void Update (int l, int r, int x) {
for (l += p - 1, r += p + 1; (l ^ r) != 1; l >>= 1, r >>= 1) {
if (!(l & 1))
Tr[l ^ 1] += x, Lazy[l ^ 1] += x;
if (r & 1)
Tr[r ^ 1] += x, Lazy[r ^ 1] += x;
Tr[l >> 1] = Max (Tr[l], Tr[l ^ 1]) + Lazy[l >> 1];
Tr[r >> 1] = Max (Tr[r], Tr[r ^ 1]) + Lazy[r >> 1];
}
for (; l > 1; l >>= 1)
Tr[l >> 1] = Max (Tr[l], Tr[l ^ 1]) + Lazy[l >> 1];
}
int Query (int l, int r) {
int Res = -Inf, Resl = -Inf, Resr = -Inf;
for (l += p - 1, r += p + 1; (l ^ r) != 1; l >>= 1, r >>= 1) {
if (!(l & 1))
Resl = Max (Resl, Tr[l ^ 1]);
if (r & 1)
Resr = Max (Resr, Tr[r ^ 1]);
Resl += Lazy[l >> 1], Resr += Lazy[r >> 1];
}
Res = Max (Resl, Resr);
for (; l > 1; l >>= 1)
Res += Lazy[l >> 1];
return Res;
}
int main () {
int n = Read (), k = Read (), m = Read ();
for (int i = 1; i <= 2 * n; i++)
a[i] = -(n - i + 1);
Make_Tree (n << 1);
for (int i = 1, x, y; i <= m; i++) {
x = Read (), y = Read ();
if (!Vis[x][y]) {
if (!Cnt[y + Abs (x - k)])
s.insert (y + Abs (x - k));
Cnt[y + Abs (x - k)]++;
Update (1, y + Abs (x - k), 1), Vis[x][y] = true;
}
else {
Cnt[y + Abs (x - k)]--;
if (!Cnt[y + Abs (x - k)])
s.erase (y + Abs (x - k));
Update (1, y + Abs (x - k), -1), Vis[x][y] = false;
}
if (s.empty ())
Print (0, '\n');
else
Print (Max (0, Query (1, *s.rbegin ())), '\n');
}
return 0;
}
Solution -「CF1373G」Pawns的更多相关文章
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- Solution -「原创」Destiny
题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...
- Solution -「GLR-R2」教材运送
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「ZJOI2012」「洛谷 P2597」灾难
\(\mathcal{Description}\) link. 给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.) 原图结点数 \ ...
- Solution -「JSOI2008」「洛谷 P4208」最小生成树计数
\(\mathcal{Description}\) link. 给定带权简单无向图,求其最小生成树个数. 顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...
随机推荐
- HCNP Routing&Switching之Super VLAN
前文我们了解了VLAN隔离技术MUX VLAN相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16196936.html:今天我们来聊一聊VLAN优化S ...
- Maven install没有将jar包加载到本地仓库
错误描述 使用mvn install:install-file -Dfile=ojdbc8-19.3.0.0.jar -DgroupId=com.oracle -DartifactId=ojdbc8 ...
- 一次IOS通知推送问题排查全过程
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 发现问题 在上周一个将要下班的夜晚,测试突然和我打招呼,说IOS推送的修复更新上线后存在问题,后台报错. 连忙跑到测试那 ...
- 十分钟快速了解《你不知道的 JavaScript》(上卷)
最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...
- Swift服务的基本使用
swift概述 Swift 最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一,为其Nova子项目提供虚机镜像存储服 ...
- nslookup:command not found的解决办法
nslookup:command not found的解决办法 通过nslookup查看DNS记录,在这里遇到了一个小插曲,nslookup:command not found(未找到命令),是因为新 ...
- 让 API 测试变的简单。
做开发已经四年有余了,之前在接口测试的时候最开始用的自己写的测试类进行测试,后来接触到了 postman 和 swagger ,虽然用起来比自己写的强太多了,但是总觉得差点事儿. 一方面是 postm ...
- iTextSharp 提取签名图像
原文 本文使用 iTextSharp 5.5.13.2,记录使用 iTextSharp 提取图片时,获得的知识点. pdf 中的签名并不是单纯的一张图片,它是由一张基础的底色图和一张蒙版图片组成.需要 ...
- WC2021 题目清单
Day2 上午 <IOI题型与趣题分析> 来源 题目 完成情况 备注 IOI2002 Day1T1 Frog 已完成 IOI2002 Day1T2 Utopia IOI2002 Day1T ...
- django框架8
内容概要 ajax简介 前后端传输数据编码格式 ajax发送json格式数据 ajax携带文件数据 回调机制处理策略 内容详情 ajax简介 页面不刷新的情况下可以与后端进行数据交互 异步提交 局部刷 ...