考试笔记

考试笔记

博客园链接

从暑假集训开始。质量不等。后面的笔记质量要高一些。

2023.08.22

T1

T2

一个很显然的思路是先预处理,把所有图形搜出来,并算出它们所占据的空间,然后对于每组询问做到 \(O(1)\) 查询(二维前缀和)。

难点就在于如何去重相同的图形。

T3

这么喜欢出矩阵乘法吗。

一眼 \(O(n^3\log{T})\) 带个 \(2^4\) 的常数进行 状压 容斥。

T4

?这怕才是签到题吧

2023.08.24

T1

dfs

才发现是 c++11,,,😦

还有评测的时候一定要开大栈空间啊,要不然我就寄了

T2

T3

首先拆贡献:累加每条边对树权的贡献。正好改造树也是删一条边、加一条边,因此大概率这个方向是正确的。

然后是一个经典的数学结论:\(\sum\limits_{i = 1}^{x}\sum\limits_{j = 1}^{y}a_ib_j = \left( \sum\limits_{i = 1}^{x}a_i \right)\left( \sum\limits_{j = 1}^{y}b_j \right)\)

也就是对边拆贡献,对点打包贡献。这样就在 \(O(n)\) 时间内得知一棵确定形态的树的权值。

然后是对每个非根节点改造树,这大概率是换根 dp?

先不慌,分析一波原题意的改造操作。

断掉一条边 \((u, v)(u =f a_v)\),形成两个连通块 \(T_v, T_u\),分别表示包含 \(v\) 的连通块和包含 \(u\) 的连通块,记 \(A_T\) 表示连通块 \(T\) 内的点权和,\(A_{\sigma}\) 表示所有点的点权之和。

对于边 \((u, v)\),它的贡献全被断了,\(- w(u, v) \times A_{T_v} \times A_{T_u}\)

对于 \(T_v\) 内的边 \((x, fa_x)\),记 \(T_x\) 表示以 \(x\) 为根的子树,贡献偏移量 \(-w(x, fa_x) \times A_{T_x} \times A_{T_u}\)

对于 \(T_u\) 内的边 \((y, fa_y)\),情况要复杂一些。记 \(T_y\) 表示以 \(y\) 为根的子树:

  • \(y\)\(v\) 的祖先,该边贡献偏移量 \(-w(y, fa_y) \times (A_{\sigma} - A_{T_y}) \times A_{T_v}\)
  • 否则,该边贡献偏移量 \(-w(y, fa_y) \times A_{T_y} \times A_{T_v}\)

这太复杂了,我们希望单次 \(O(\log)\) 甚至 \(O(1)\) 查询贡献的改变量,即尽量不去枚举每一条边,那么大概又要进行打包计算。但是目前看起来没什么眉目,不如把加边的贡献偏移量也写出来。

连一条边 \((u, p)\),该边贡献偏移为 \(w(u, v) \times A_{T_v} \times A_{T_u}\)

对于 \(T_v\) 内的边 \((x, fa_x)\)

2023.08.25

T1

首先最多进行 \(2\) 轮交易,撑到第三轮开头结束。

然后考虑在第 \(i\) 个人结束的充要条件,即考虑在第 \(i( + n / +2n)\) 次交易时结束的充要条件:

前缀不同数的数量小于交易次数。感觉很对啊!

对你吗。

跳会儿,再跳一会儿!

最后一小时才用 \(O(n)\) 过完所有样例。嗯。

T4

29pts 显然。

欸等等这个区间 dp 为什么是对的???

做了一个小时 \(a_i \le 1\),未果。寄。

T3

这个 \(C = 0\) 看起来要拿到才行啊。

T2

相邻大小关系确定,大概是线段树优化 dp 转移。吗的,还剩 50 min,跟你爆了

对你吗。

2023.08.29

T1

,,,

T2

感觉就是一个大分类讨论题。

T3

首先考察对于一个确定的序列,如何求出一段区间的权值和。那么首先就要知道如何快速计算一个点的权值和。

权值由两部分组成:

  • 加入新点,这部分权值是固定的,必为 \(n - 1\)
  • 改变捕虫网能力值,贪心地考虑这个能力值只增不减,

2023.08.30

T1

nmd 不给大样例

大概得写个暴力,综合几场模拟赛来看,除了我们出的那套,T1 应该不会为难你。

T2 拍上了,回来认真做 T1。

看上去一个比较显然的贪心策略是,如果可以改变队头元素,那一定是进行改变更优。

但这个贪心真的对吗!!!不对。

(模拟ing

结果:\(n = 3 \to ans = 8\)

\(n = 4 \to ans = 16\)

逆天

没写暴力,直接交了个 \(2^n\)。至少我模拟了 \(n = 3, n = 4\),怎么也有保底分。

T2

经典套路:连边,形成若干连通块,对于边数大于等于点数的连通块,可以直接任选;否则连通块一定是一棵树,如果这棵树内的点权均只在该树中出现,且查询区间包含该树的值域,那么就不合法。

(下面在胡扯了)

但这并不是充要条件:如果一种点权分别只在两棵树中出现,且查询区间同时包含这两棵树的值域,并且这两棵树除了该点权的其它点权均只在自己所在的树中出现,那么这时同样不合法。

思路有点卡,不妨先把一些显然的东西处理了。

首先,成环连通块(即边数大于等于点数)内的点权是 free 的(即选择它不会使得某种点权无法被选择)。如果一棵树上存在一个点权是 free 的,那么这棵树上的点权都是 free 的。剩下一些不是 free 的点权,接下来就是要处理上面说的那个问题了,如何针对这些树判断查询是否合法。

树可以分为这几类:

  • 被判定为 free 的,这类已经与成环连通块没什么区别了。
  • 树中的点权均只在该树中出现,则如果查询区间包含该树值域,就一定不合法。
  • 树中的点权一部分只在该树中出现,还有一部分可能在其它树中出现。这时我灵光一闪,不妨把这些树连到一块去。欸不对,等等,,,,

一种点权只会在一个连通块里出现啊!!!

好了,重新来一遍,属实是铸币了。

  • 判断成环连通块,这些点是 free 的。

  • 否则剩下的树中的点权一定是只在这棵树中出现,只要查询值域 完全包含任意 一棵树的值域,那么该查询区间就不合法。

    对每棵树记录最小点权和最大点权。现在问题来到了如何快速判断?

    其实这个问题等价于:给你若干条线段,称查询区间合法当且仅当它不完全包含任意一条线段,问查询区间是否合法。

    这个可以转成二维平面上的矩形覆盖,然后扫描线做。但这题它居然 \(10^6\) 还只开 \(1s\),我觉得这事不太对啊,难不成有线性做法?

    好家伙,思考了一分钟果然想到了大概可行的线性做法。

    对每个位置作为左端点,维护向右最远的右端点使得区间合法。这玩意具有单调性,可以直接根据已知线段赋初值,然后从右往左扫一遍即可。

    但实际上仍然不是线性的,因为有并查集。

口胡完 T2 过去一个小时了,现在要么老实做 T1,要么继续口胡下面的题。,,,

打算先把 T2 写了。很快啊,过小样例。开始对拍。这个怎么拍?大概可以写一下那个 \(k \le 10\)\(2^k\) 暴力。哇!拍出来拉!啊?暴力写挂了。

这个 \(10^6\) 啊,不能再犯没开快读的大罪了。

T3

求无向简单图(无重边和自环)的本质不同(点不同或边不同)的四元环权值和(四个点权之和)。

那啥,记得三元环有一个 \(O(n\sqrt{n})\) 的算法,不过已经不太会了;现在又来个四元环,感觉事情有些难办啊。

注意此题的部分分给的非常鲜明,看上去 \(O(n^2)\) 的做法能得 \(60pts\),不妨先思考 \(O(n^2)\) 的做法。

首先要考虑以什么方式统计权值。很自然地想到拆贡献,即统计每个点对答案的贡献,那就要去数每个点分别出现在多少个四元环中。

然后考虑以什么方式确定是四元环的形态。(没思路,此时回过去干 T1,发现过于逆天)

对于 \(n \le 2 \times 10^3\),想到了一种 \(O(\frac{n^3}{w})\) 的做法:用 bitset 存储连边信息,枚举点对 \((x, y)\) 作为四元环上非相邻的两个点,bitset 求出同时连接 \(x, y\) 的点的数量 \(cnt\),则以 \(x, y\) 作为相对顶点的四元环数量为 \(\binom{cnt}{2}\)

对于 \(n \le 10^5\),这更是标准的 \(O(\frac{n^2}{w})\) 的数据范围,但应该怎么做呢?

T4

有一种感觉告诉我,这是线段树合并。

对每种权值开一个线段树,记录该权值在序列中出现的位置。

这样查询的时候直接拉出来合并,问题在于修改时的复杂度不对。

但这样已经有 \(60pts\) 了,赶紧拿下。

2023.09.07

这么毒瘤的吗。

T1

如果 \(m\) 很小可以直接 dfs。

如果值域很小可以 \(O(n^2)\) dp。

T2

这个,,,难评。Sue 的小毬 进化版。

多记录一维表示考虑区间外有多少根蜡烛对答案有贡献。

20min 切

T4

每次操作,在三维空间上加入一个平面 \(z = x_ix + y_iy\),并询问此时 \((a_i, b_i)\) 处的最大值。

对于一个平面 \(z = Ax + By\),记 \(x\) 系数为 \(A\)\(y\) 系数为 \(B\)

保留最上层的平面,对不同时期加进来的平面进行染色,发现二维投影下每种颜色至多只会占据一个区域,这些颜色块由若干条射线(以下射线均定义在二维投影下)分隔。加入一个平面,可能会删掉一些射线(即覆盖之前的上层平面),并且至多增加两条射线。考虑维护这个射线集合,不难想到,如果增删射线的时间复杂度是 \(O(\log)\) 以内的,那么可以暴力增删射线,因为最多只会有 \(2Q\) 条。

难点就在于如何确定被影响区域的范围。

可以考虑用极角表示一条射线。

假设当前平面为 \(S\)。如果我们已知一条射线 \(ux + vy = 0\)\(S\) 作为最上层平面,则以 \(ux + vy = 0\) 向两侧扩展,每遇到一条射线 \(l\),就判定 \(S\)\(l\) 的最上层平面的上下关系,任选 \(l\) 上的一个位置进行判定即可。如果 \(S\) 可以覆盖该射线,则在射线集合中删除 \(l\),并继续向两侧扩展。否则,终止扩展,并手动计算出 \(S\) 的边界射线(与边界区域的最上层平面联立求解)。

那么问题就是如何找到 \(S\) 的初始射线,这个大概可以三分做?没写过三分,不太会。

贴两张图。

2023.09.14

T1

只有收到消息的 doge 是可以跳的。

T2

直接做不太会,考虑二分答案,这样每个位置至少需要加多少次就定下来了。

问题转化为:第 \(i\) 个位置至少要被覆盖 \(w_i\) 次,要求从 \(m\) 个区间中选出恰好 \(k\) 个区间进行线段覆盖,问是否存在合法方案。

然后有一个 naive 的 \(O(n\log{n})\) 想法(单次判定),每个线段的左端点挂上该线段,从左往右扫,把 \(i - 1\) 位置剩下的线段(也有可能是 \(i - 2, i - 3, \dots\) 位置为左端点的线段)继承到 \(i\) 位置,并在优先队列中按照右端点从大到小排序,每次取出队头将其覆盖,并影响到之后的位置(区间修改单点查询,这个可以用树状数组维护,常数小),直到该位置被覆盖 \(w_i\) 次,继续向后移动。

总时间复杂度为 \(O(n\log{n}\log{V})\),不知道能不能跑过。

如果仅仅是两只 \(\log\) 就结束的话,那此题应该才是签到题。

毕竟还有 \(a \le 100\) 这种奇怪的值域条件没有用到。

我还真不太会这个玩意儿怎么写暴力拍,,,。

upd:注意判断取出来的线段右端点是否 \(\ge\) 当前位置。模拟赛挂了 \(80\) 分。

T3

分成左右两侧各 \(n\) 个点,分别从大到小排序,考虑将左侧点向右侧点连边(小 -> 大),容易发现右侧可连点是一段前缀,并且随左侧点数值的减小,前缀的位置单调不降。按左侧点从大到小的顺序给左侧点安排一个可行的右侧点,贪心地去做这个事情,可以得到不改变国籍时,最多能有多少个配对。

T4

盲猜:当图中存在奇环或 \(K_{3, 3}\) 时,输出 NO,否则输出 YES

奇环是好判的,问题在于找 \(K_{3,3}\)

2023.09.18

T3

很难想象此题居然是根号分治。

\[\begin{aligned} \sum\limits_{i = b_k + 1}^{2n - 1}\binom{i - k - 1}{i - n}2^{2n - i} \end{aligned} \]

\[\begin{aligned} \sum\limits_{i = l}^{r}\binom{i - x - 1}{n - 1}2^{2n - i} \end{aligned} \]

假设 \(n, k\) 同阶,注意到形式 \(\sum{k} \le 2\times 10^5\),因此 \(> \sqrt{2\times 10^5}\)\(k\) 不超过 \(O(\sqrt{n})\) 个,这部分直接 \(O(n)\) 算。

对于 \(\le \sqrt{2 \times 10^5}\)\(k\),预处理出上面那俩个玩意儿的前缀和,分段处理。

没判组合数上下标不能为负数调了 30min+。

爆了。

2023.09.20

T1

原,大原题,我甚至知道这个题在蓝桥杯有一道,在 CF 上还有一道。

由于是 CSP-S 模拟赛,所以只开了原题范围。但其实可以用多项式做的,只不过要套个 MTT。

先把每个数 \(a_i\)\(x^2\) 去了,剩下所有 \(\text{core}(a_i)\),问题转化为有多少种排列使得没有相邻两个数字相同。

尊重原题面,用 \(O(n^3)\) 的方法来做。

考虑用插空法,从小到大枚举 \(\text{core}(a_i) = x\),记 \(f_{i, j, k}\) 表示填了 \(i\) 个数,非 \(x\) 的相邻对数为 \(j\)\(x\) 的相邻对数为 \(k\) 的方案数。

考虑 \(f_i \to f_{i + 1}\) 转移:当前共有 \(i + 1\) 个插空位置,记 \(w\) 表示 \(a_{i + 1}\) 在之前共填了多少个。

  • \(a_i \neq a_{i + 1}\)

    \[\begin{aligned} f_{i + 1, j + k - 1, 0} &\leftarrow (j + k) \times f_{i, j, k} \\ f_{i + 1, j + k, 0} &\leftarrow (i + 1 - j - k) \times f_{i, j, k} \end{aligned} \]

  • \(a_i = a_{i + 1}\)

    \[\begin{aligned} f_{i + 1, j, k + 1} &\leftarrow (2w - k)\times f_{i, j, k} \\ f_{i + 1, j - 1, k} &\leftarrow j \times f_{i, j, k} \\ f_{i + 1, j, k} &\leftarrow (i + 1 - j - 2w + k) \times f_{i, j, k} \end{aligned} \]

T2

这个没见过,但感觉是一个很典的题。

如果能预处理每两个点 \(s \to t\) 是否可转移,那么这个题就做完了。所以 \(40pts\) 一定要拿到。

然后就卡住了。有一个想法是固定 \(s\),然后将其它点极角排序,但感觉并没有什么实质性的作用。

T3

原,我甚至在看到题面后能立即记得它的原名。

酒桶这波什么逼操作啊

T4

\(35pts\):从 \(0\) 开始一个一个确定,每确定 \(S\) 里的一个数就拿出来做一遍背包,应该是没有大问题的。

不对,这个时间复杂度是不是有点危啊,?

记得昨天做货币系统时看到鱼的题解是用生成函数的视角去做的,不妨我也来试一试。

首先可以通过 \(\sum{cnt}\)\(|S|\),记 \(m = |S|\)

考虑可重集 \(S = \{ s_1, s_2, \dots, s_m \}\),能够直接对应出每个子集和的方案数:

\[\begin{aligned} \prod\limits_{i = 1}^{m}(1 + x^{s_i}) = \sum\limits_{w}F_{w}x^{w} \end{aligned} \]

其中 \(F_w\) 即为给出的数组。

套路地进行求对:

\[\begin{aligned} \sum\limits_{i = 1}^{m}\ln(1 + x^{s_i}) =\ln\left( \sum\limits_{w}F_wx^w \right) \\ \sum\limits_{i = 1}^{m}\sum\limits_{j \ge 1}\frac{(-1)^{j + 1}}{j}e^{s_ix} =\ln\left( \sum\limits_{w}F_wx^w \right) \\ \end{aligned} \]

等等,右边是坨什么?卡住了。

2023.09.22

T1

好奇怪的题。

先分析一些特殊情况:

链:所有边都能拉直。

偶环:选取一对环上距离最长的点对,使得所有边拉直在一条线上。

长度为 \(c\) 的奇环:选取一对环上距离最远的点对,使得 \(\frac{c}{2}\) 条边拉直。

拼起来后发现不会分析了。

换个思路,发现两点间可拉直的边数是它们之间最短路并集的大小。

于是想到可以魔改 Floyd:

先正常地用 Floyd 做一遍全源最短路。

然后再做一次 Floyd:如果中间点 \(k\) 满足 \(d(i, k) + d(k, j) = d(i, j)\),则将 \((i, k)\)\((k, j)\) 的路径并加入到 \((i, j)\) 的边集中。

但是这玩意儿是 \(O(n^3m\log{m})\) 的(\(\log{m}\) 是用 set 维护边集),并且空间开不下,肯定得寄飞。

由于边权均为 \(1\),所以可以对每个点作为起点做 BFS,这样时间复杂度可以降为 \(O(n^2m\log{m})\),空间复杂度为 \(O(nm)\),感觉还是很寄。

能不能不记录边?利用分层图的思想,我们去记录一个点记录能转移到它的上一层的点集,这可以用 vector 维护。枚举起点和终点,从终点开始不断转移到上一层的点。由于是分层的,转移时不会出现一条边被记录两次的情况。从终点开始遍历完后,更新边数的最大值。

这样直接做就是 \(O(n^2m)\) 的了。为了避免被卡,考虑按距离从大到小枚举终点,被遍历过的点在之后就再不作为终点,因为一定不优。应该有很强的优化效果。

upd:\(id[i]\) 写成了 \(i\)。寄。

T2

一眼感觉是个很恶心的数据结构维护 dp 题。

先考虑 \(p_i\) 互不相同的情况,这部分的 dp 状态很容易设计。

\(f_{x, w, 0 / 1}\) 表示序列的最后一个数填 \(x\),处于下降/上升阶段,一共形成了 \(w\) 个峰的方案数。

然后就只会用数据结构来优化了。

想一下没有特殊性质的 \(n \le 1000\)

T3

T4

2023.09.25

T1

首先有 10pts 的状压可以先写了拿来当拍子。

以下按照栈顶到栈底给牌编号为 \(1 \sim n\)

然后模拟一下发现了以下事情:

  • 在编号最大的被拿走的牌之前,至多只有两张牌未被拿走。

  • 拿走从上往下第 \(3\) 张牌后,在编号最大的被拿走的牌之前,恰好有两张牌未被拿走。

感觉很可以 dp 啊!

称在编号最大的被拿走的牌之前未被拿走的牌为空位。

存在以下转移:

  • 两个空位变一个空位
  • 一个空位变没有空位
  • 一个空位变两个空位
  • 没有空位变两个空位

\(f_{i, j, k}\) 表示 \(i\) 作为在编号最大的被拿走的牌,之前存在两个空位 \(j, k(j < k)\) 的最大价值。

\(g_{i, j, k}\) 表示 \(i\) 作为在编号最大的被拿走的牌,最后一张被拿走的牌是 \(j\),存在的空位是 \(k\)。如果空位不存在则 \(k = 0\)

这个状态很妙啊!完全依靠了我们所发掘出来的性质:如果剩两个空位,则必然最后一个选择的牌就是编号最大的被拿走的牌,即 \(i\);否则我们无法确定最后一个选择的牌是谁,但是此时多出来的空余的状态,因此把最后一个选择的牌记录到这个空位上。

另一个角度来讲,\(f\) 记录的是拿走从上往下第 \(3\) 张牌后的状态,\(g\) 记录的是拿走从上往下第 \(1\) 张牌后的状态。

写一下 dp 转移:(下记 \(V(x, y)\) 表示 \(x, y\) 在花色或点数上至少有一个相同)

\[\begin{aligned} g_{i, j, k} &\xleftarrow{\max} f_{i, j, k} + w_{j}, V(i, j) \\ g_{i, k, 0} &\xleftarrow{\max} g_{i, j, k} + w_{k}, V(j, k) \\ g_{i, i, 0} &\xleftarrow{\max} g_{i - 1, j, 0} + w_{i}, V(j, i) \\ f_{i, j, k} &\xleftarrow{\max} f_{i - 1, j, k} + w_{i}, V(i - 1, i) \\ f_{i, k, i - 1} &\xleftarrow{\max} g_{i - 2, j, k} + w_{i}, V(j, i) \\ f_{i, i - 2, i - 1} &\xleftarrow{\max} g_{i - 3, j, 0} + w_{i}, V(j, i) \\ \end{aligned} \]

由此可见,应先更新 \(f\) 值,再更新 \(g\) 值。

前三个数的 dp 值可以手算出来,避免之后的 dp 过程繁琐的特判。

时空复杂度均为 \(O(n^3)\)。空间要算好!这个可是 \(10^8\)​ 级别的。我趣,有点危险啊:(

嗯,过了状压的拍,还剩两个小时多一点。挂了两三次,都是因为手算算错了:(

只是让我疑惑的是,为什么限制条件会如此简洁,以至于会让人思考这是不是一个突破口。但实际上,限制条件并不影响解决这道题。

T2

先打暴力!暴力有 10pts!

T3

先打暴力!暴力有...好像有点恶心人。

T4

先打暴力!建图跑最短路,有...欸我趣,怎么还高精呢?

找性质!最优方案一定是选择不断向右下方跳,而不会绕远路。这显然。

最短路就成废物了,因为可以直接进行一个 \(O(n^2)\)​ 的 dp。但是高精很讨厌!所以特殊的代价形式一定有很大的作用。

再找性质。如果一个左上方的点 \(l\) 和一个右下方的点 \(r\) 之间存在一个点 \(x\)(这个点不能在两个点围成的矩形边界),则一定选择先跳到这个点更优。这是由代价的形式是 \(2\) 的次幂导致的,也比较显然。

然后考虑 \(x\) 在边界的情况。\(x\) 在短边的边界上一定不优,遂考虑 \(x\) 在长边上的情况。

假设短边长 \(a\),长边长 \(b = i + j\)\(x\)\(2^b\) 细分成两个贡献:\(2^{\max(a, i)} + 2^{j}\)

很好!(大概?)发现了此题最核心的部分,就是这种划分长边的情况该如何判定。

当每行每列只有一个 CPU 时,就不存在划分长边的情况,还不知道怎么用这个做特殊性质的 \(n \le 10000\)

\(500\) 大概是给一个 \(O(n^3)\) 的区间 dp 之类的,但没时间写了。

2023.09.27

T1

唯一分解定理。

\[\begin{aligned} A = \prod\limits_{i = 1}^{m}p_i^{\min(c_{i, 1}, c_{i, 2}, \dots, c_{i, n})} \\ B = \prod\limits_{i = 1}^{m}p_i^{\max(c_{i, 1}, c_{i, 2}, \dots, c_{i, n})} \end{aligned} \]

对每个质数单独计算贡献,再把所有质数的贡献乘起来。

问题转化为:已知一个序列的最大值和最小值,求有多少种合法序列。

假设最大值为 \(b\),最小值为 \(a\),则贡献的一个上界是 \((b - a + 1)^{n}\)。减去未抵满下届的方案数:\((b - a)^{n}\)。减去未抵满上界的方案数:\((b - a)^{n}\)。加上上下界均未抵满的方案数:\((b - a - 1)^{n}\)

\(a = b\) 时,要特判贡献为 \(1\)。当存在 \(a > b\) 时,贡献为 \(0\),总答案为 \(0\)

时间上没有太大问题。

T2

注意是左闭右开。

感觉一下,应该是贪心出一个选择区间的顺序,然后转为序列上的划分问题,从而列出 DP 转移。

然后又想到了一个方向:按坐标轴上的位置从左往右 DP 可行吗?貌似不太行。

罚坐了将近一个小时,尝试抛开 DP 只想贪心。然后想出了一个很劣且不清楚正确性的算法:以所有线段长度和作为初始答案,每次合并两个线段变为它们的交,选择有交且答案减少量最小的一组进行合并。

手头有个比较大的样例,但给它 \(5\) 分钟应该跑得出来。先试一下。不要用 set 删,直接给被删线段打个标记更快。

好的,16s 就跑出来了,但是假了。错误也比较显然,相同变化量的不同合并会导致不同的可合并线段对集合不同。

upd:不会 \(O(n^3)\)!很严重!确实是应该找一个序列进行 dp 的,但没有去尝试去掉包含关系,所以想不出来。问题出在把这个题的步骤想得太简单了,以为可以一步到位。

T3

原题。神题!

T4

有个 \(O(n^2\log{n})\) 的 50pts。

upd:写的像矢一样。还是波特赛后帮我把暴力调出来的。另外没有想到时间倒流的更优暴力!很差劲。

2023.10.01

T1

线段树优化矩乘典题,先放一放,等到后面做不动的时候愉悦身心。

愉悦丁真,鉴定为:阿米诺斯,施魔的卡常。

T2

原题,这不 100pts!

眼花了,其实没见过。

仔细观察——作为一道图论题,点数和边数的范围居然如此小!很难不让人往 DP 的方向去想。

再具体观察数据范围分布,感觉可以骗走的分挺多。这不打部分分?

这不 70pts?

\(f_{u, i, j}\) 表示走到点 \(u\),用了 \(i\) 元钱,目前剩余 \(j\) 单位油量能走过的最长路程。

分析一下状态数:\(O(n^3C)\)。爆!一个转移的时间复杂度:\(O(n)\)(枚举下一个点是谁)。嗯,还能接受。

怎么转移?Dijkstra!状态数?爆!多源?爆!

全给它炸完了。

不慌,起手 35pts。

开始下暴论!——这是一道不断优化状态的最短路题。不对,最长路。爆!Dijkstra 都解决不了了。

这下起手 0pts。

Dee-why-char 式戏剧性开头!

upd:写了性质分!但是爆零了!

T3

当牌确定时,肯定先使用 \(k - 1\) 张较大的强化牌,再使用最大的那张攻击牌。因为强化牌至少使伤害翻一倍,一定不劣于选取一张攻击牌。如果所选的 \(m\) 张牌中不足 \(k - 1\) 张强化牌,则强化牌全选,剩下的牌依次取攻击牌中较大的几个。

简单dp即可。

大概 1h 过了小样例,准备去做 T2。

upd:T1过了,T3被卡常了。

T4

2023.10.03

T1

大概是构造题罢:|

构造你吗,盲猜 \(W = x \times y(x, y \in \P, x \neq y)\) 形式的数不美丽。

样例 1, 2, 3 都符合。打!

大了,看来还有另外的不美丽数。

原来手玩的时候眼花了,把 \(12\) 判成美丽的了。

盲猜 \(W = x^{2} \times y \text{ or } x \times y^{2}(x, y \in \P, x \neq y)\) 就不美丽。打!

我趣,莽对了。

T2

没读懂题,

T3

这不打暴力?

T4

Helltaker,启动!

box1

有点困难的一关,算是初步会用 checker。

box2

傻逼,不如地狱把妹狂。

box3

还是傻逼。

box4

难度上来了。观察性质:目标位置是一列。推测策略:自下往上填充。

这个不太会,速速切割。

box5

考察不断优化步数的能力:51->50->48。

见好就收。

box10

没忍住,再拿点分。127setps

2023.10.04

帮出题人赛时 AK 然后爆零。

T1

DAG 上 DP。

T2

很像函数调用!但我没有做那道题:(。

对于第二问,把 \((x \times 2 \times 2 + k) \times 2 + \dots\) 的形式倒过来看,对每个 \(+\) 预处理出它被乘的系数,可以做到线性。

对于第三问:

  • 如果 \(x\) 为奇数且上一步操作为 $ \times 2$,则直接返回那一步的团队编号。
  • 如果 \(x\) 为偶数且上一步操作为 \(\times 2\),则 \(x = \frac{x}{2}\) 并继续观察。
  • 如果 \(x < k\) 且上一步操作为 \(+k\),则直接返回那一步的团队编号。
  • 如果 \(x \ge k\) 且上一步操作为 \(+k\),则 \(x = x - k\) 并继续观察。

如果直到最后都没有被任意一个团队截胡,那么答案为 \(0\)

最多进行 \(\log\)\(x = \frac{x}{2}\),而 \(-k\) 可以预处理。对于 $ / 2$ 暴力跳,对于 $ - k$ 分段跳,单次询问是 \(O(\log)\) 的。

所以这个题不难,但是有点烦?

写得巨慢,调得也巨慢,只剩下 1h20min 了。

T3

\(10^7\) 计数?(我最喜欢的?)推式子题!

观察样例 1050912,看看能不能直接猜出来。不能。

老实推式子吧。先得有一坨能推的东西啊!看看能不能设计一个 DP。不对,应该先找性质。

\(n = m\),感觉是要么 \(0\) 要么 \(2\)

\(n + 1 = m\)

  • \(n\) 为偶数时,感觉是只能从 \(n \times n\) 多扩展一列。
  • \(n\) 为奇数时,分成 \(2\)\(n \times \frac{m}{2}\)(但归约之后怎么拼起来呢?)

其它情况,大概可以归约到上面两类?

???!!!???

想不清楚。

T4

《暴力 暴力 快打暴力》不会暴力。

感觉是一道背包神题?

2023.10.05

T1

如果 \(w_i < 0\) 那就是另一番光景了,但这是 T1。

所以如果一个关键点的子树内没有其它关键点,那肯定就不会往下走了。

并且最优路径一定是将这些关键点串起来的链集。

观察一下部分分,Subtask4 显然是给每次暴力跑虚树的。

...

只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?只会树剖,怎么办?时间劣常数大还难写,这不是 T1。

set 维护关键点集,考察每次操作的增量。如果当前操作点 \(u\) 的子树内有关键点,则增量为 \(0\),否则增量绝对值为 \(u \sim lca(u, x)\) 的点权和(\(lca\) 取深度最大的那个)。求 \(lca\) 是经典问题,拿 \(dfs\) 序上前后两个关键点求一下取深度较大的那个即可。

傻逼 dyx 以为要求个最近关键点祖先什么的东西,一直吊死在两只 log 走不出来。

这么看来好像还挺小清新的。

清新你吗,要被卡常力:(

T2

最简单的一道题。

拆到每个位置上的贡献,\(O(|S||T|)\) 暴力匹配乘个 \(2^{k - cnt}\)\(cnt\) 表示匹配成功时 \(T\)\(?\) 的个数)即可。

T3

\(\gcd(a_i, a_j) = \min(a_i, a_j)\) 说明每个数对都成倍数关系,并且题目保证 \(a_i\) 互不相同。以下默认 \(a\) 已从小到大排序。

对于 \(m \le 5 \times 10^6\),先写个暴力 DP,因为每次 \(a\) 的数值至少翻一倍,时间复杂度是 \(O(m\log{m})\) 的。

对于 \(n \le 3\)

  • \(n = 1\) 时:\(ans = 1\)
  • \(n = 2\) 时:假设 \(a = \{ 1, x \}\),则 \(ans = \lfloor \frac{m}{x} \rfloor + 1\)
  • \(n = 3\) 时:假设 \(a = \{ 1, x, y\}\),则 \(ans = \sum\limits_{i = 0}\left( \lfloor \frac{m - ix}{y} \rfloor + 1 \right)\)

停!这是类欧!我们也便明白了 \(\gcd(a_i, a_j) = \min(a_i, a_j)\) 这个条件的重要性——如果没有这个条件,原问题是不弱于类欧的。这是 NOIP 模拟赛,自然不应该这么离谱。

对于 \(n = 3\),重新设 \(a = \{ 1, x, kx \}\),则:

\[\begin{aligned} ans &= \sum\limits_{i = 0}^{m - ikx \ge 0}\left( \lfloor \frac{m - ikx}{x} \rfloor + 1 \right) \\ &= \sum\limits_{i = 0}^{m - ikx \ge 0}\left( \lfloor \frac{m}{x} - ik \rfloor + 1 \right) \\ &= \left(\lfloor \frac{m}{kx} \rfloor + 1 \right)\lfloor \frac{m}{x} \rfloor - k\times \frac{\left( \lfloor \frac{m}{kx} \rfloor + 1 \right)\lfloor \frac{m}{kx} \rfloor}{2} + \lfloor \frac{m}{kx} \rfloor + 1 \end{aligned} \]

于是又拿了 20pts。

对于更大的 \(n\),应该联想到子问题归约。

具体地,记 \(f_{x}(m)\) 表示考虑 \(a_x \sim a_n\) 除以 \(a_x\) 后的序列拼出 \(m\) 的方案数。

\[\begin{aligned} f_x(m) = \sum\limits_{i = 0}^{\lfloor \frac{m}{a_{x + 1}} \rfloor}f_{x + 1}(i) \end{aligned} \]

初始值 \(f_n(m) = 1\)

然而大概实在是不会做罢。

T4

争取拿到前三档部分分。啊好像不太好搞啊...

先看特殊性质,就是不会自动成环,那么初始局面也必不会有环,并且链长至多为 \(1\)。那直接统计一下有多少个点的出度 \(\ge 1\) 就可以了!

2023.10.06

最暴躁的一集。

一坨矢。

1h 没看懂 T1。

2h 获得了 20pts。

2.5h 开做 T1。

???

T1

操你吗 T1 动态三维欧几里得最小生成树

这不魔幻花园?这不魔幻花园?这不魔幻花园?

维护 \(n^2\) 条边关于时间的二次函数,由于问的是最小生成树形态数,因此具体边值不重要,维护距离平方即可。

然后考察这些边值的大小关系,考虑每个边对的大小关系发生改变的时间点,共 \(m^2 = n^4\) 个,预处理出来。

相当于二次函数解交点。啊?

每个关键时间点暴力更新,看更新大小关系后,小的那条边是否能替代之前那条边。

要记录一下最小生成树上边按权值排名之类的东西,替换的时候同步更新。

时间复杂度 \(O(n^5\alpha(n))\)

T2

做你吗

T3

做你吗

T4

做了你吗

2023.10.08

打得太抽象了。调了 4h T1。爆零了。

2023.10.09

T1

简单计数题。

一开始想着把蓝球看成 \(+1\),红球看成 \(-1\),然而我的代数能力为 \(0\),因此这种方法对我不太友善。

然后很快意识到这个可以看成从 \((0, 0)\) 出发,蓝球则 \(y \to y + 1\),红球则 \(x \to x + 1\),到达 \((n, m)\) 且不越过 \(y = x + k\) 的方案数。

如果 \((n, m)\)\(y = x + k\) 之上,那直接输出 \(0\)

否则考虑用卡特兰数的类似做法,让总路径数 \(\binom{n + m}{n}\) 减去强行越过 \(y = x + k\) 的方案数。

这个不好看,转成不碰到 \(y = x + k + 1\) 的方案数。翻转碰线后的路径,可知后者等于 \((0, 0) \to (m - (k + 1), n +k + 1)\) 的方案数。

T2

这肯定要用并查集维护最小生成树的构建过程。

一开始想的是只考虑树上的边的加入(或倒着看成撤销),发现不太好计数。

然后发现可以直接按边权添加,如果是树上的边,那更新并查集;否则看有多少可以添加的方案:所有连通块的最大接受边数之和 - 已经存在的边数。

还是简单题。为什么做得这么慢?

T3

没时间看 T3。只能打暴力了。

T4

读错了很久的题,一直没看懂样例。

题目要求的是蚊子在保证能从 \((-\infin, 0)\) 走到 \((+\infin, 0)\) 的前提下的所有路径中均未到达的区域,而不是随意一个路径能到达就完事了。

由样例可知,答案区域一定由倾斜 \(45\) 度的矩形构成。为了简化问题,数据保证了挡板长度为偶数。

每个挡板的上下端共会产生 \(4\) 条限制直线,答案应该就是这些直线围成的区域(但是注意不同的直线其限制方向不同)。

\(n \le 2000\) 有 50pts 的部分分,这不打?

考虑用 \(y = \pm{x} + k\) 的形式维护直线,然后 \(O(n^2)\) 暴力做一遍扫描线即可。

等等,宽度难道不可以预处理吗?这不 \(O(n)\)

感觉事情变得诡异起来。

傻逼,答案区域怎么可能是若干个矩形这么简单,而且预处理宽度的做法是错的。

重来。

有交的挡板先全部处理掉。

答案的小数部分只可能是 \(0.0\)\(0.5\),所以算面积的时候可以先默认全部二倍,最后输出的时候再除回来。

答案区域形如锯齿状,且锯齿只存在于上下两侧。

2023.10.11

抽象。

2023.10.12

我组题。

终于可以补题了,感动:)😦😐

2023.10.14

本周的最后一次抽象。

抽象能不能快点死吗。

T1

抽象。本周最后一次不会 T1。

upd:这么会用 bitset?

T2

把所有 \(a_i > a_j, \frac{b_i}{a_i} > \frac{a_j}{b_j}\) 的物品 \(i\) 给踢了,这样就只剩几十个物品了,剩下的物品尽量先选大的再选次大的,以此类推。

考虑每个物品会在所有 \(f(x), 0 \le x < n\) 中被贡献多少次。

对于物品 \(i\),它的贡献以 \(a_{i + 1}\) 为一个周期。

\(g_i\) 表示物品 \(i\) 在一个周期内的贡献次数:

\[\begin{aligned} g_i = \sum\limits_{k = 0}^{\frac{a_{i + 1}}{a_i} - 1}a_i\times k = a_i \times \frac{\frac{a_{i + 1}}{a_i}\left( \frac{a_{i + 1}}{a_i} - 1 \right)}{2} \end{aligned} \]

整周期直接算 \(g\) 的倍数即可。对于余出的部分也可以 \(O(1)\) 计算,但会有点烦人。

T3

2023.10.04 二周目

T1

\(N\) 是奇数时,\(N\) 没有偶约数,答案为 Odd

否则记 \(M = N / 2\),若 \(M\) 为奇数,则答案为 Same,否则为 Even。显然。

T2

贪心地考虑从后往前操作。模拟即可。

T3

把所有数求最大公约数可以得到最小变化量 \(d\),用 map 存每个数模 \(d\) 的结果即可。

upd:记得判 \(K > \max(a_i)\) 无解。痛失 AK。

T4

行列交换是独立的,所以可以将行和列分别做。以下只讨论行。

将每一行看作一个点,用并查集维护行之间的可交换情况,而事实是:同一连通块内的行可以任意交换,这意味着一个大小为 \(x\) 的连通块对答案有 \(x!\) 的乘积贡献。

暴力维护并查集即可。

T5

和 T2 一个道理,从前往后把没清除的给搞掉即可。进行一次投放炸弹的影响可以用差分维护,找到影响区域可以使用 upper_bound

T6

考虑一种划归子问题的构造方式:每次把最大的元素移动到它正确的位置。很显然,这一步对答案的贡献为 \(1\)\(0\)

启发我们发现一个重要性质:如果不进行相邻元素的对换操作,元素所在位置的奇偶性是不会改变的。

对每个元素的初始位置与结束位置做差,则答案的上界为差为奇数的元素个数。我们称这些元素为关键点。

我们希望一次相邻对换尽可能操作两个关键点,而事实就是:最开始猜测的那种构造方式,一定可以做到这一点!

我们不妨设当前最大元素为 \(x\),进行简单的分类讨论。

  • \(x\) 不是关键点,则直接移到它的结束位置,划归到子问题。
  • 否则,分 \(x\) 奇偶讨论,发现必然可以通过相隔对换将一个关键点放在 \(x\) 结束位置上,实现 \(x\) 与这个(与 \(x\) 奇偶性相反的)关键点的对换。

关键点数量一定是偶数。这很显然.根据上述分析,答案就为关键点数量的一半。

2023.10.17

原题大赛?

T1

记得当年的表达式求值只拿了 30pts。

今天大概可以直接保龄了,因为我甚至已经不知道后缀表达式是什么。

尝试猜测什么是后缀表达式。

突然回想起之前一个人被流放到文化课去自学的时候,物理考试用 80min 猜测什么是折射率,最后得了 42 分的快乐时光。

猜对了!还剩 40min 时过掉大样例,逆天改命了。

upd:RE 挂了 60pts

upd:测的时候把我放过去了,

T2

这个感觉有点意思,感觉比 T3 难。

过掉 T1 后果断打 T2 暴力。这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?这不上 300?

先别发电。分析一下暴力怎么打。

\(O(2^n\times m\log{m} + 3^{n})\)。好!

最后 15min 过了两个样例,形势一片大好。这个大概有 80pts。

好像不会爆 int 吧,不管了。

T3

原,好像补了。upd:不是原。

首先,如果要让答案变小,则要改的边肯定在直径上。以下规定直径的一端为根。

暴力枚举修改哪条边并重新求树的直径,时间复杂度 \(O(n^2Q)\),可以通过前两个点。

假设修改的边是 \((u, v)\)\(fa_v = u\),考察新的直径,\(u\) 上面的部分保留,\(u\) 下面的部分要么是最长链替换掉一条边,要么是选择接次长链。所以变化量可以 \(O(1)\) 得知,时间复杂度 \(O(nQ)\),可以通过前六个点。

然后把直径拉出来考虑序列问题:

给定每个点两个权值 \(a_i, b_i\),每次询问给出一个数 \(x\),求:

\[\begin{aligned} \min\limits_{i = 1}^{cnt}(\max(a_i, b_i + x)) \end{aligned} \]

这个的做法是:将二元组按 \(a_i - b_i\) 的差从小到大排序,每次询问时,二分出一个界,使得左边的所有元素取 \(b_i + x\),右边的所有元素取 \(a_i\),再把两部分合起来取最小值。

嗯,开写。

中途出了玄学 bug,把我的暴力都搞寄了,很生气。

过掉 大(?)样例只剩 2h 不到了。

T4

原,DP,但是没补,悲。

直接枚举连哪些边,30pts。

\(k = 1\) 做一个 DP,\(k = 2\) 做一个 DP,两者各 20pts。

写完 70pts 暴力后被 fire 问到 “做完了没?”

此时前两题还没做,

upd:最后 10min 回来改一下 \(k = 2\) 的暴力。之前只判了端点的最短路,但实际上还应该考虑环内两侧点的最短路。

这样是 \(O(n^4)\) 的,但考虑到小常数还是冲了上去。毕竟这样才是正确的算法。

upd:\(k = 1\) 挂了,

2023.10.31

T1

不如傻逼树状数组优化前缀 min。

T2

\(0 \sim 0\)\(1 \sim 2\)\(2 \sim 1\)

T3

接近 40pts 的暴力先打为敬。

注意到 \(k\) 很小,

2023.11.01

T1

大模拟,不想看。

做了好久...

T2

概率论,不想看。

为什么大家都秒了啊,我读题用的时间 = 波特切题用的时间。

担心被卡精度。

T3

看起来是个不断优化状态的图论题,建立状态 \((z, w)\) 表示从 \((x_{s}, y_{s})\) 到达机房 \(z\) 进行 \(w\) 次移动 2 所需花费的最小代价。

由于直行代价是 \(O(n)\) 的,进行一次移动 2 必然增加一花费,故 \(w \sim O(n)\)。记 \(c\) 表示机房数,则有效状态数为 \(O(cw)\),连边数量应为 \(O(c^2w)\),期望可得 80pts。

MLE 挂成 30pts 了 😦

T4

没时间做了。

2023.11.04

今天获得了 10pts。

T1

两小时才会 T1,我滚回去学生物吧。

对于 \((x, y)(x < n, y < m)\)\(f_{x, y} = \frac{\binom{x + y}{x}}{2^{x + y}}\)

对于 \((n, y)(y < m)\)\(f_{n, y} = \frac{\binom{n + y - 1}{y}}{2^{n + y}}\)

对于 \((x, m)(x < n)\)\(f_{x, m} = \frac{\binom{x + m - 1}{x}}{2^{x + m}}\)

求所有 \(f\) 约分后的分母最大值。

考察 \(\binom{x + y}{x}\) 包含多少个质因数 \(2\):(没想到昨天刚学的技巧今天就用上了)

\[\begin{aligned} w(\binom{x + y}{x}) &= w((x + y)!) - w(x!) - w(y!) \\ &= \sum\limits_{i = 0}^{\infty} \left( \lfloor \frac{x + y}{2^{i}} \rfloor - \lfloor \frac{x}{2^{i}} \rfloor - \lfloor \frac{y}{2^{i}} \rfloor \right) \\ \end{aligned} \]

不用介绍了,直接利用库默尔定理,\(w(\binom{x + y}{x})\) 等价于二进制下 \(x, y\) 同为 \(1\) 的位数。

我们把分母与 \(w(\binom{x + y}{x})\) 同时考虑,做一遍 \(O(\log^{2}{V})\) 的数位 DP。

\(dp_{i, j, 0 / 1, 0 / 1}\) 表示考虑低 \(i\) 位,\(x, y\) 同为 \(1\) 的位数为 \(j\)\(x\) 是否超上界,\(y\) 是否超上界时 \(x + y\) 的最大值。

总时间复杂度 \(O(T\log^{2}{V})\),还要带 \(16\) 倍常数。不是,你玩尼玛。经测试要跑 2s。

此时冒出一个大胆的想法,根据大量的模拟结果,是不是 \(x < n, y < m\) 的情况一定不优?

首先,对于 \((n - 1, y)\)\((x, m - 1)\),确实是不优的。

对最后相同的 \(j\) 进行考虑,

算了。10^5 拍了一百多组都没拍出来,应该是对的。

如果有另解那我是傻逼,否则 T1 放这种东西我真想问候组题人。

还有不开 O2 我直接爆零好吧。

upd:直接取个右上角长为 \(\log\) 的正方形暴力更新即可,至少能降 \(4\) 倍常数。我是傻逼。而且数位 DP 写挂了。

refl:对这个组合数的模型不够敏感;对这类问题的处理过于死板,有比数位 DP 更好的解决方法,但没有想到;数位 DP 写挂。这三个问题很严重。

upd2:把库默尔定理用错了,,,

T2

暴力

等等,感觉可以做,\(5\times 10^6\) 显然是在卡数据结构,也许树状数组可以艹过去。但这个问题看起来就非常单调队列或者单调栈之类的。

先想想数据结构吧。\(f_i = f_{i - j} + cost(i - j + 1, i)(j \ge k)\)。加入 \(a_{i}\) 后,会影响一段后缀的后缀 \(\min\) 或后缀 \(\max\)

我会用单调栈上二分做到 \(O(n\log^{2}n)\)

upd:输出格式挂了。

T3

暴力

T4

暴力

2023.11.06

FST 场!

FST = fast subtask TLE。(确信

T1

据 liuhangxin 说,应该是很毒瘤的。

但是老哥算法好像很若至。

4e6 跑一只老哥!冲!

好好好,本地 1.8s 应该能卡过去的吧。

T2

一开始想的是直接取最小的 \(K\) 个即可,但马上就被 hack 了。

考虑从小到大替换调整,发现出现相等元素时不好判断谁更优。

考虑倒序删数,总把加和最大的一个二元组取出来,把其中数值大的那个删掉即可,如果数值相等也不必考虑那么多,随便选一个删即可。

好好好,不让 set 过是吧。

T3

听说是原,但我没印象。

一眼区间 DP,二眼笛卡尔树,三眼需要离散化。

\(f_{l, r, x}\) 表示考虑区间 \([l, r]\),区间最大值为 \(x\) 的利润最大值。

枚举状态和区间最大值所在的位置 \(p\),时间复杂度 \(O(n^3\sum{K})\)。不是,这怎么玩?

哦,其实应该是 \(O(n^2\sum{K})\),因为枚举每个 \(p\) 时并不用把状态中的 \(x\) 枚举完。

考虑砍掉一个 \(n\),,,击掰,我区间 DP 怎么能砍掉 \(n\)

T4

看起来是可以矩乘优化数位 DP 的若干老哥状物,但由于 \(T \le 10^6\) 所以显然不是正解,最多只能带一只老哥。

2023.11.08

T1

非常好T1。

感觉几年前就做过的题啊?

T2

我们可以利用 OEIS 进行合理开挂

发现把当前最大的数移到最后面之后,剩下的数形成的一个子问题。

\(f_{i}\) 表示考虑 \(1 \sim i\) 的期望交换轮数,则有:

\[\begin{aligned} f_{i} = f_{i - 1} \times \frac{1}{i} + (f_{i - 1} + 1) \times \frac{i - 1}{i} \end{aligned} \]

但其实这是不对的,最大数位置之前的数会进行交换,这可能会减少交换轮数。

实际上这里就体现了交换轮数的本质,这与每个数 \(x\) 是否在 \(1, 2, \dots, x - 1\) 出现位置之后有关。

我们不妨考察不同的插入位置减少轮数的期望值,于是有:

\[\begin{aligned} f_{i} = \frac{1}{i}(f_{i - 1} + 1) + \frac{1}{i}\sum\limits_{p = 1}^{i - 2}\left( f_{i - 1} + 1 - \frac{p!(i - 1 - p)!}{(i - 1)!} \times \frac{p - 1}{p} \right) + \frac{1}{i}f_{i - 1} \\ \end{aligned} \]

但还是错的,感觉往这方面想好像有点绕。

分析过程具有后效性,不如直接看能否对一个确定的排列快速计算冒泡排序的轮数。

考虑一个绝对正确的算法。记 \(a_i\) 表示 \(i\) 之前 \(>p_i\) 的数量(突然发现这个想法在之前有道 AT 的题遇到过啊)。则:

\[\begin{aligned} cnt = \max\limits_{i = 1}^{n}a_{i} \\ \end{aligned} \]

\(f_{i}\) 表示 \(cnt \le i\) 的排列数量(经典套路了),则:

\[\begin{aligned} ans = \sum\limits_{i = 1}^{n}(f_{i} - f_{i - 1})\times i \\ \end{aligned} \]

计算 \(f_{k}\) 仍然考虑从小到大插数即可:

\[\begin{aligned} f_{k} = \prod\limits_{i = 2}^{n}\min(i, k + 1) \\ \end{aligned} \]

好好好,终于有了个正常复杂度的算法。

这下随便优化一下就可以线性了。哦好吧带个老哥应该无所谓。

真是把自己蠢到了。

T3

好多暴力。

T4

看起来是数据结构。

但是好多暴力!

2023.11.11

T1

看起来就非常区间 DP。

\(f_{l, r, x}\) 表示考虑 \([l, r]\) 区间,剩余的数为 \(x\) 能进行操作的最大数量。

T2

一个 naive 的贪心是每次找到最大(如果有连续相同的则选连续段边界的)的 \(a\) 将其减一。这样实在是太低效了。

考虑将相同的一段值压缩为区间,每次选取一段 值最大?长度最小?的区间,一直操作它直到它与它前后的区间权值持平。

所以到底如何排序呢?发现应该先预处理出初始可以拎出来削减的区间,再在这些区间内先削减长度小的。

对一个区间执行一次该过程的时间复杂度是 \(O(1)\) 的,每次该过程都会减少一个区间,总执行次数是 \(O(n)\) 的,由于可能要用 set 维护,故总时间复杂度为 \(O(n\log{n})\)。可能还要写并查集什么之类的。

将询问离线,在过程中稍微做一下 dirty work 即可。

说着很容易,但实现真的很恶心。

啊,只剩两个小时了。为什么要调这么久啊。

upd:为什么过了大样例能挂啊

T3

先想想 A 性质怎么做。

\(cnt_u\) 表示 \(u\) 子树内的颜色限制,\(f_u\) 表示考虑子树 \(u\) 内使用 \(cnt_{u}\) 种颜色(不考虑从 \(m\) 种颜色中选取的系数)的方案数。

\(f_u\) 可以通过容斥进行计算。坏了,只会 \(O(nm)\)。等等,把容斥式子写出来,发现大部分项都被消掉了!但好像还是只能 \(O(nm)\)

2023.11.12

T1

若购买的初始状态集合为 \(S = \{ p_1, p_2, \dots, p_m \}\),则最小花费为:

\[\begin{aligned} W &= \sum\limits_{i = 1}^{m}(p_{i + 1} - p_{i})a_{p_i} + \max\limits_{i = 1}^{n}(p_{i + 1} - p_{i} - 1)k \\ \end{aligned} \]

考虑初始时 \(S = \{ 1, 2, \dots, n \}\),然后不断选择最优的一个元素进行删除。

29。29。29。29。29。29。29。29。

行,我手玩。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。29。

爆。

你能不能给个样例解释。

期待 NOIP 时看不懂 T1 样例。

哦,CSP 已经发生过了(笑。

T2

做一亿遍单调三向链表即可。

T3

有一个显然的 \(O(n^{n!})\) 的 DP,可以拿 90pts。

T4

哦。

2023.12.02

T1

猜测连续叶节点对应连续值域,这个一眼丁真鉴定为假。

猜测最终叶节点权值形成排列,这个似乎有点说的道理。

看了看这个 \(q\)\(0 \le q \le 2n\)\(2n\)?什么若至。

考虑枚举排列,有 \(n\) 个区间加一的操作,要使代价最小。

贪心地每次取出非 \(0\) 的最小的数往上找一个合法线段并把覆盖范围内的所有数减 \(1\),最终使得所有数变成 \(0\)

感觉还可以继续贪心进而省掉枚举排列的过程,尝试每次把自身权值最大的叶节点拎出来做覆盖。

先乱写一下。至少有 8pts:(

最后半个小时发现自己读错题了,以为代价是 \(x \times v_i\)。寄 。

T2

\(n \le 5000\) 时,直接暴力,否则发现答案的值域很小,直接枚举 \(ans\),然后判断是否存在:

\[\begin{aligned} f(r) - f(l - 1)\times base^{r - l + 1} = f(r) \\ \end{aligned} \]

化一手同构:

\[\begin{aligned} \frac{f(l - 1)}{base^{l - 1}} + \frac{ans}{base^{r}} = \frac{f(r)}{base^{r}} \\ \end{aligned} \]

然后存 \(\frac{f(x)}{base^{x}}\),把 \(\frac{ans}{base^{r}}\) 移到右边去,每次看是否存在 \(\frac{f(l - 1)}{base^{l - 1}}\) 满足条件。需要注意的是不能用 map,要手写哈希表。

T3

2023.12.09

T1

我会 \(3^{n}\) 暴力!

我会 \(m = 1\)

我会 \(m = 1\)\(n^2\)

想正解。二分后随便写个贪心。

先写个暴力的贪心(\(O(n^{2}\log{V})\))。哇,这么牛。

然后考虑优化,具体写一下匹配的判定式:

\[\begin{aligned} (t_{j} - t_{i}) \times v \ge |x_{j} - x_{i}| \\ \end{aligned} \]

这么难看:|

这时拿暴力测了一下大数据。蛙趣,挂了:|发现只会在 \(m\) 比较小的时候离谱。摆:|

T2

当字符串中不包含 (( 时,这相当于经典的取石子游戏,一堆石子的个数为其中的括号对数。

注意修改不是删除字符,而是可以替换整个字符串。

这下算不出 SG 值喽,😐

T3

考试时学了很久历史版本和。但是打了个暴力就走了:|

滚去看作业题了。

2024.01.09

T1

\(O(n^2)\)\(O(nk\log{n})\) 是容易的。

感觉要上 wqs 二分。

感觉很对啊!

但是 \(O(n\log^{2}{n})\)。不管,先码一个上去。

但是不会 DP:|

无所谓,我会爆零。

T2

一眼 DP of DP。欸不对你这个字符集是 \(O(n)\) 的啊:|

保留下来的最优序列 LIS 一定是原序列 LIS 长度减一。

...

可能是建图跑个 DP 什么之类的。

建图可以用数据结构维护一下 \(O(n\log{n})\) 建出边数 \(O(n)\) 的 DAG,这是个老套路了。

然后在上面选尽可能多的点使链长不超过原来 LIS 长度减一。

等等,删掉尽可能少的点使得若干源汇点不相同,这不是拆点跑最小割?

无所谓,我不会网络流,所以还是爆零。

upd:分析错了,边数不为 \(O(n)\)

T3

一眼区间 DP。再一眼 Sue 的小毬。欸不对你这个区间 DP 怎么跑 \(3 \times 10^{5}\) 啊:|

无所谓,我会爆零。

2024.01.10

事后补记。

T1

一道简单的换根 DP,但是写了 300+ 行的平衡树。实现能力太差了。

T2

博弈论!不能要了。upd:应该打的。

T3

猜结论计数,会不了一点。有这点时间我都能在 T2 多拿点分了。

2024.01.22

T1

一眼点分树,求出每个节点固定的贡献系数,然后算出初始答案。

然后这个链上加权值完全是假的,因为是求全局和,所以直接累计到答案上即可,于是只需要支持链上求和,不需要修改。这样就不必写树链剖分了,直接预处理 ST 表做到一只老哥。

但是时间复杂度瓶颈好像在点分树,这部分并不是那么容易的。

首先,可以预处理出分治子树内的路径长度可重集,集合大小之和是 \(O(n\log{n})\) 的。同时可以处理出震波那道题的类似信息(动态开点线段树)。

然后,为了处理出每个节点被合法路径经过的次数,在点分树向上跳 \(O(\log{n})\) 层,每一层都枚举一遍该节点的集合,然后在线段树上查询能拼成长度在 \([L, R]\) 的路径数量。

胡的很爽,实际上完全不能写,而且貌似带三只老哥:|,而且空间会爆。

发现完全没必要用点分树,直接正常分治用差分搞一下就可以了。但还是要上数据结构,很不爽。

时间复杂度 \(O(n\log^{2}{n})\)。大样例跑了 0.5s,有点小怕。

T2

T3

Observation 1:最多只会进行 \(\lfloor \frac{n}{2} \rfloor\) 次鸡尾酒排序。

Observation 2:手玩 \(k = 1\)

upd:没有挂分,而且 T3 被馈赠了 10pts /se

2024.02.14

T2

原,不会。

T3

原,不会。

\[\begin{aligned} \sum\limits_{i = 1}^{x}B^{v} = B^{\frac{x(x + 1)}{2}} \\ \end{aligned} \]

2024.02.15

T3 撞我模拟赛了。

2024.02.16

猛磕 T1 磕出来了,但是爆 int 挂了 30pts。

2024.02.24

这套是和霸树换的。

T1

很快啊!显然直接考虑统计每个排列最终能到达的形态数求和,只需知道有标号循环最终能到达的形态数,显然这只与循环大小有关,记为 \(f_{i}\)(还要考虑乘上圆排列数)。答案即为 \(n![x^{n}]\exp(F)\)

花了点时间模拟一下,感觉最终循环被搞成了一个环接很多棵根向树的形态。那就有:

\[\begin{aligned} f_{n} = (n - 1)!\sum\limits_{i = 1}^{n}\binom{n}{i}(n - i)![x^{n - i}]\exp(G_{i}(x)) \\ \end{aligned} \]

其中 \(G_{i}(x)\) 表示把若干个点接在大小为 \(i\) 的循环上的 EGF,相当于在普通的有标号有根树 EGF 的每一项系数都乘个 \(i\),尝试写出 \(G_{i}(x)\)

\[\begin{aligned} G_{i}(x) = \sum\limits_{j \ge 1}i\left( j^{j - 1} \right)\frac{x^{j}}{j!} \\ \end{aligned} \]

然后可以做到 \(O(n^{3})\)​​(晕)。

\(G(x)\) 表示普通的有标号有根树 EGF,\(\hat{G}(x) = e^{G}\)​。

由于 \(e^{iG} = e^{i}e^{G}\) 浪费至少一个小时,望周知。

\[\begin{aligned} f_{n} = (n - 1)!n!\sum\limits_{i = 1}^{n}[x^{n - i}]\frac{1}{i!}\hat{G}(x)^{i} \\ \end{aligned} \]

我靠,翻阿尔法的博客发现了一个结论:\(G(x)\) 的复合逆为 \(xe^{-x}\)。其实很显然。

同时 \(\hat{G}(x) = e^{G}\) 的复合逆应为 \(\frac{\ln{x}}{x}\)

冲刺!

\[\begin{aligned} f_{n} &= (n - 1)!n!\sum\limits_{i = 1}^{n}\frac{1}{i!}[x^{n - 2i}]\frac{1 - \ln{x}}{x^{2}}\left( \frac{x^{2}}{\ln{x}} \right)^{n - i + 1} \\ f_{n} &= (n - 1)!n!\sum\limits_{i = 1}^{n}\frac{1}{i!}[x^{n - 2i}](x^{2})^{n - i}\frac{1 - \ln{x}}{(\ln{x})^{n - i + 1}} \\ \end{aligned} \]

汗流浃背了。


啥也没交回去睡觉了。

我靠,我纯傻逼,如果你也没看出来那你也是傻逼。不过也好,重学了一遍拉反。

最后谁踏🐎省选模拟赛T1NTTT2LCTT3拉反。

posted @ 2023-09-25 12:18  Schucking_Sattin  阅读(36)  评论(0编辑  收藏  举报