「CSPS 2019 十一」数据结构

栈与队列

单调栈,单调队列,优先队列。

蚯蚓

Description

给你一堆数,有 \(n\) 个,并对他们操作 \(m\) 次。每次取出最大的一个数 \(x\),称之为母数。并将 \(x\) 分割成左端数 \([x \times p]\) 和右端数 \(x-[p \times x]\),并把这两个数放回数堆中,其余数均增加 \(q\) 。\(p\) 固定为 \((0,1)\) 的有理数。要求输出每次操作的数x和m次操作后所有数的和。

Solution

对于 $85% $ 的数据,是可以用优先队列搞的。我们用优先队列维护所有蚯蚓的长度,每次取出长度最长的蚯蚓,将其切成两半并丢回队列。有一个问题是如何让其他蚯蚓的长度增加 \(q\) 呢?可以记录蚯蚓整体增加的长度,对被切成两半的蚯蚓,将其长度 \(-q\) 即可。

对于 \(100\%\) 的数据,数据范围不允许带 \(log\),但是找规律可以发现一个隐藏的单调性先切成两半的蚯蚓的一半一定别后切成两半的蚯蚓的对应一半长。所以可以用三个队列分别维护没有被切的蚯蚓,被切成 \([x \times p]\) 的蚯蚓,和被切成 \(x- [p \times x]\) 的蚯蚓,每次选出三个队列中最大的蚯蚓切一下再丢回对应队列中即可。


永恒的契约

Description

有 \(n\) 块石头,排成一个环,第 \(i\) 块石头高度 \(a_i\),两块不同的石头 \(i,j\) 能够互相看到,当且仅当它们在环上的两条路径中有至少一条路径上,除了两个端点,路径上石头高度都不大于 \(min?(a_i,a_j)\)。求有多少对石头能互相看到。

Solution

首先考虑一个子问题,将原问题放在一条链上,且所有 \(a_i\) 都不相同。如果我们能处理出两个数组 \(L\) 和 \(R\),\(L_i\) 表示 \(i\) 左边第一个比它大的数,\(R_i\) 表示 \(i\) 右边第一个比它大的数。那么只需线性扫一遍,如果一个数前驱计数器 \(+1\),有后继计数器 \(+1\) 就可以了。那么问题在于如何求这两个数组呢?\(O(n^2)\) 暴力是会超时的,我们考虑用单调栈来搞定。维护一个单调递减的单调栈,从前往后遍历 \(a\)。假如当前遍历到了 \(a_i\),栈顶元素为 \(a_j\)。如果 \(a_i>a_j\),就将 \(a_j\) 弹出,一直到 \(a_i < a_j\) 时,将 \(a_i\) 压入栈并记录 \(L_i = a_j\)。同理,我们从后往前枚举,就可以求出 \(R\)。

将子问题扩展到 \(a_i\) 有相同的情况,若 \(a_i = a_j\),\((i,j)\) 可以互相看到,我们可以记录一个 \(sum\),\(sum_i\) 表示\([i,R_i - 1]\) 有多少个数 \(=a_i\),显然对于相等的情况我们不需要分出前驱和后继。进一步地,我们考虑将子问题扩展到环上,我们要求一个点,从这个点把环切成两半,但是这样会让我们的答案个数减少,所以我们还要用各种统计把答案加回来,现在选择哪个点切开最好呢?显然是切开最大的数,有多个的话切开任意一个。为什么?显而易见,除了 \((i,j)\) 中至少有一个最大数,没有任何一个其他的 \((i,j)\) 能通过这个最大数互相看到。所以最后我们 \(O(n)\) 扫一遍看看有多少个数可以和最大值互相看到就可以了。

并查集

路径压缩,按秩合并,带权并查集。

食物链

Description

动物王国中有三类动物 \(A,B,C\),\(A\) 吃 \(B\), \(B\) 吃 \(C\),\(C\) 吃 \(A\)。现有 \(N\) 个动物,以 \(1 \sim N\) 编号。每个动物都是 \(A,B,C\) 中的一种,但是我们并不知道它到底是哪一种。

一个人按顺序说了 \(K\) 句话,第一种说法是 1 X Y,表示 \(X\) 和 \(Y\) 是同类。第二种说法是 2 X Y,表示 \(X\)吃\(Y\)。但这 \(K\) 句话真假不明,当一句话满足下列任一条件,这句话就是假话,否则就是真话。

  1. 当前的话与前面的某些真的话冲突,就是假话;
  2. 当前的话中 \(X\) 或 \(Y\) 比 \(N\) 大,或当前的话表示X吃X,就是假话。

求假话的总数。

Solution

并查集能维护连通性、传递性。比如朋友的朋友是朋友,朋友的敌人是敌人。但是,维护敌人的敌人是朋友就很难维护了,所以就有种类并查集的诞生。这道题有三个物种,于是我们给并查集开三倍的空间。对于每种生物,第一倍空间储存同类,第二倍储存猎物,第三倍储存天敌,我们不能确定每种生物是 \(A\) 还是 \(B\) 还是 \(C\),知道生物的相对关系就够了。

讨论第一种话,\(X\) 与 \(Y\) 是同类,可以转换成 \(X\) 不吃 \(Y\) 且 \(Y\) 不吃 \(X\)。如果有一点不满足,那么就是谎言。如果都满足,那么 \(X\) 的同类都是 \(Y\) 的同类,\(X\) 的天敌都是 \(Y\) 的天敌,\(X\) 的猎物都是 \(Y\) 的猎物。再讨论第二种话,\(X\) 吃 \(Y\),可以转换成 \(X\) 与 \(Y\) 不是同类且 \(Y\) 不吃 \(X\)。如果有一点不满足,那么就是谎言。如皋港都满足,那么 \(X\) 的同类是 \(Y\) 的天敌,\(X\) 的天敌是 \(Y\) 的猎物,\(X\) 的猎物是 \(Y\) 的同类。

线段树和树状数组

线段树合并,线段树懒标记,线段树维护。

树状数组求逆序对,最长单调子序列。

权值线段树,主席树。

公路建设

Description

有 \(n\) 个城市,编号依次为 \(1\) 到 \(n\),它们之间计划修建 \(m\) 条双向道路,其中修建第 \(i\) 条道路的费用为 \(c_i\)。 有 \(q\) 次询问,每次询问选定一个区间 \([l, r]\) ,仅使用编号在该区间内的道路。他希望选择一些道路去修建,使得连通块的个数尽量少,同时,他不喜欢修建多余的道路,因此每个连通块都可以看成一棵树的结构。计算最小的费用。

Solution

先考虑暴力做法,就是将区间内的边扔进一个数组去跑 Kruskal。但是这个题的 \(n\) 极小,这意味着我们可以用线段树维护跑 Kruskal 可能用到的边,为 \(O((M + q)NlogM)\)。


Kinoman

Description

有一个长度为 \(n\) 的序列 \(f,f_i \in 1 \sim m\),有一个长度为 \(m\) 的价值序列 \(w\) 。选择一个区间 \([l,r]\) 获得的价值是
\[
\sum_{i=l}^r w_{f_i} \times [count(f_i)=1]
\]
问价值最大的区间的价值。

Solution

预处理出每个数在序列 \(f\) 中第一次的位置,和 \(f_i\) 在 \(f\) 中下一个出现的位置 \(nxt\)。用线段树维护每个位置作为右端点的答案。首先预处理出以 \(1\) 为左端点的答案。当 \(l + 1\) 时,\([l, nxt_i - 1]\) 间答案 \(-w_{f_l}\)。而 \([nxt_i, nxt_{nxt_i} - 1]\) 间答案 \(+w_{f_i}\)。如果 \(nxt\) 不存在,可以看作是 \(n + 1\)。然后每次更新最大值。


练习题

Description

给定一棵 \(N\) 个节点的树, 每个点 \(i\) 有权值 \(a_i\)。有 \(Q\) 个询问, 对于询问 \(x,y,k\) , 分别输出树上从 \(x\) 到 \(y\) 的路径中, 权值小于 / 等于 / 大于 \(k\) 的点的数目。强制在线。

Solution

这是对树的查询,我们可以通过求 \(lca\) 转换成对一条链的查询。套路地,对于一个点 \(x\),我们维护一个权值线段树以维护一个桶 \(b\),对于每一个在根到 \(x\) 路径上的点 \(y\),令 \(b_{a_y}++\)。当然,我们不能对每一个点重新建立一棵线段树,这个线段树要支持单点修改和区间求和,区间求和求的是前缀和。我们可以先 dfs? 一遍原来的树,在 dfs 的过程中建立主席树。


Mex

Description

有一个长度为 \(n\) 的数组 \(a_{1 \sim n}\)。\(m\) 次询问,每次询问一个区间内最小没有出现过的自然数。即求区间 mex。强制在线。

Solution

考虑建立权值线段树,维护每一个权值在原数组中最后一次出现的下标。对于查询操作 \([l,r]\) ,可以取出右端点所对应的主席树,并在树上二分查找下标小于 \(l\) 的最小权值即为答案。虽然 \(a_i\) 非常大,显然答案不会超过 \(n\),所以不用离散化。

咕咕。

原文地址:https://www.cnblogs.com/lyfoi/p/11620443.html

时间: 2024-07-31 14:31:50

「CSPS 2019 十一」数据结构的相关文章

「CSPS 2019 十一」 贪心

一般来说,如果题目需要求一个最优解或者最小(大)花费之类的,而且除了暴力之外想不到什么好方法,那么就可能需要用贪心. 通常地,我们猜想一些步骤能不能直接使用贪心,然后再去证明这个贪心是对的. 有时候可能要多想几种贪心才能找到正确的那一种. New Year Snowmen Description 要堆起一个雪人,需要三个不同大小的雪球.现在有 \(n\) 个给定大小的雪球,问最多能堆起多少个雪人,并输出方案. Solution 每次用数量最多的三个雪球是最优的.可以用一个单调队列,每次取出最大的

「CSPS 2019 十一」三地联考

因为版权原因,不放题面. 幸福 Solution 只会写 \(70\) 分的找规律代码,可以考虑每个斐波那契数对卷积的贡献,发现贡献是类似于倒斐波那契数列,就可以 \(O(n)\) 做了,有 \(70\) 分. std 是化简一下式子,化简结果为 \[F_n = F_{n-1} + F_{n-2} + f_n\] 发现这是一个递推式,用矩阵乘法加速即可.但是我不会矩阵乘法,先咕了.不会矩阵乘法也可以用退出来的递推式拿 \(70\) 分. Code #include <bits/stdc++.h>

「CSP-S模拟赛」2019第一场

目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) 都缺一个小特判. \(T3\) 打了个比暴力优的暴力 还是暴力,但是不知道为什么 \(WA\) 穿了. 考试的时候还玩扫雷... 其实,菜是原罪啊... ___ T1 小奇取石子 题目 点这里 考场思路 刚开始差点被自己坑了,开考 \(5min\) 就码出了一个可以惨痛爆零的 \(01\) 背包.

「CSP-S模拟赛」2019第二场

目录 T1 Jam的计数法 题目 考场思路(正解) T2 「TJOI / HEOI2016」排序 题目 考场思路(假正解) 正解 T3 「THUWC 2017」随机二分图 题目 考场思路 正解 这场考试的数据感觉很水. \(T1\) 签到不解释,\(T2\) 期望 \(50pts\) 结果有 \(100pts\),\(T3\) 一如既往地不可做... ___ T1 Jam的计数法 题目 点这里 考场思路(正解) 其实没有什么好说的,找找规律即可,看看代码吧. #include<cstdio>

loj 3014「JOI 2019 Final」独特的城市

loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长链上一定有和他到\(x\)距离相同的点,矛盾 然后对于一个点,最长链端点一定可以是直径的两端点之一,所以如果我们分别以树的直径的两端点为根进行dfs,那么一个点在其中一次dfs中,独特的点都会在到根的路径上,所以我们用栈维护到根的点,然后不同颜色数开桶来维护,每次压栈或弹栈时改变桶内元素个数,然后根

#3144. 「APIO 2019」奇怪装置

#3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始测量经过的时刻数 \(t\),但该装置的创造者却将 \(t\) 用奇怪的方式显示出来.若从该装置开始测量到现在所经过的时刻数为 \(t\),装置会显示两个整数:\(x = ((t + \lfloor \frac{t}{B} \rfloor) \b

loj #3146. 「APIO 2019」路灯

loj #3146. 「APIO 2019」路灯 暴力的话就是查询\((l,r)\)之间是否全部是1,考虑如何优化查询 我们可以利用\(set\)来维护每一个全\(1\)区间和它出现的时间,具体的,用\((lp,rp,l,r)\)来表示\((lp,rp)\)的全\(1\)区间在时间\([l,r]\)中是存在的 那么对于一个在时间\(i\)的询问\((l_i,r_i)\),\((lp,rp,l,r)\)会对它产生贡献当且仅当\(lp\leq l_i,rp\geq r_i,i\geq l\),产生的

loj #3144. 「APIO 2019」奇怪装置

loj #3144. 「APIO 2019」奇怪装置 很明显的是我们需要找到\((x,y)\)的循环节的长度 当\(t=0\)时,\(x=0,y=0\) 当\(t\neq 0\)时,仍然要使的\(x=0,y=0\)的话,必有 \[ \begin{cases} t+\lfloor \frac{t}{B} \rfloor \equiv0(mod\ A)\t\equiv0(mod\ B) \end{cases} \] 记\(t=t'B\),则有\(A|t'(B+1)\),故\(t'\)最小为\(\fr

CSP-S 2019 游记

CSP-S 2019 游记 想了很久,最后还是决定动笔写下这篇游记. 耳边是单曲循环的「火花」. まだこの世界は 仆を饲いならしていたいみたいだ 望み通りだろう 美しくもがくよ I 时间过得真快.转眼间我已经陪了他一年了. 记得他第一次见到我的时候,才刚上初三呢. 看着屏幕上毫无规律的字母排列在一起,我只能仰望. 有时候他会突然开心得大叫起来,有时候又会十分苦恼的挠头. 有时候他会与同在这一间教室其他人谈天说地,房间内外充满了欢乐的气氛. 我只静静地坐在桌上,看着他. 有时候他会把我敲得生疼,但