12 月记录

QOJ14945

QOJ14949

QOJ14711

QOJ14718

QOJ2064

给出一棵树,初始 \(S_u=\{u\}\)\(m\) 次操作:

  • 输出包含 \(u\) 的集合个数。
  • 给出一条树边 \((u,v)\),令 \(S_{u}=S_v \leftarrow S_{u}\cup S_v\)

\(n\le 2\times 10^5,m\le 6\times 10^5\)


注意到,\(u\) 能扩散到的位置是一个连通块,且 \(u\) 能到 \(v\) 当且仅当修改操作存在一个子序列恰好为这条路径。

考虑点分治,预处理 \(u\) 扩展到根的最小时间,根扩展到 \(u\) 的最大时间,则 \(u\) 扩展到 \(v\) 的条件就是 \(u\) 到根最小时间 \(<\) 根到 \(v\) 最大时间。

对于保证修改在查询前面的弱化版:有一个更厉害的做法。

考虑先转化查询为查 \(S_u\) 的大小。

\(|S_u\cup S_v| = |S_u|+|S_v|-|S_u\cap S_v|\)

于是考虑维护每条边交的大小,惊奇地发现进行一个操作,\((u,v)\) 这条边的交就是大小,无需修改!

并且还能发现:其他边的交不变!

更厉害的是:对这个东西进行转置,倒序进行操作序列,就能知道包含一个点的集合个数。(证明考虑一个集合能包含一个点等价于修改操作存在子序列为路径翻转)

CF2161F

QOJ14685

QOJ14025

给出一个无向图,带点权、边权,初始每个位置上都有一个人,可以花费边权代价将一个人移动一条边,可以花费点权代价合并一个点上的两个人,求最小代价。

\(n\le 5\times 10^5,m\le 10^6\)


首先每个点出度显然 \(\le 1\),否则,将代价大的那个人到代价小那个人处合并更优。

显然也不会有环。

故问题等价于:给定一个带点权的完全图,两点间的距离为给定图中它们的最短路,定义一棵内向生成树的代价为边权加每个点的点权乘上其子节点数量(入度)的和,求代价最小的内向生成树。(原因大概就是指向的终点就是这个点被合并的地方)。

考虑优化代价的计算,定义边权为 \(a_i+dis(i,j)+a_j\),代价为边权和,这样子每个非根节点会被多算一次,但是好处是转化为生成树且去掉了点权,并且可以自动钦定 \(a_i\) 最小的节点为根!!!

怎么在原图上修改边权呢?类似那道题的方法,新建 \(n\) 个虚点,连接 \((i,i+n,a_i)\)

问题变为求解边权为两点最短路的最小生成树。

这是经典问题,只需要从关键点开始扩展,对每个点记录距离最近的关键点,只需要对相邻连通块之间的边拿出来构建 MST 即可,正确性可以由 kruskal 证明。

时间复杂度 \(\mathcal O(n\log n)\)

QOJ14419

https://atcoder.jp/contests/fps-24/tasks/fps_24_r

QOJ14426

QOJ5039

P11983 [JOIST 2025] 展览会 3 / Exhibition 3

AT_joisc2017_d 切符の手配 (Arranging Tickets)

QOJ11802

QOJ15501

歌莉娅(gloria)

给你一个 \(n\times m\) 的循环网络,每个点有独立概率向四个方向走。

\(q\) 次操作:

  • 修改一个格子的概率。
  • 给定起点和终点,求到终点的期望时间。

\(n\le 10^5,m\le 5,q\le 3\times 10^4\)


首先可以想到对相邻两行设主元,将终点扣掉,并对终点下方设一个元,用上所有方程以及终点的方程即可求解。

但其实这个系数递推是线性的,可以矩阵乘法快速求得。

考虑用线段树维护区间转移矩阵乘积。

而为了避免多设的那个元可以考虑选取终点以及下方两行为主元求解。

注意你的转移矩阵应该视为每个主元对当前 \(2m\) 个点的贡献而不是其他什么东西!

时间复杂度 \(\mathcal O(qm^3\log n)\)

死之魅舞(glamour)

定义两个长为 \(n\),值域 \([0,V]\) 的序列 \(a,b\) 是好的当且仅当可以进行若干次如下操作相等:

选择 \(i,i+1\),交换 \(a_i,a_{i+1}\) 并将两个数用 \(V\) 减去。

分别给定 \(a_i,b_i\) 的上界,计数好的 \(a,b\) 对个数。

\(n,V\le 100\)


妙妙题!

观察:定义一个序列的特征序列为对偶数位置令 \(x\leftarrow V-x\)

则一次操作等价于交换特征序列的两个值!

问题变成了要求多重集相等并进行分配。

有若干位置限制为 \(\le\),若干位置限制为 \(>\)

类似 CSP2025 T4 可以有一个提前钦定的做法。

\(f_{i,j,k,p}\) 表示考虑 \(\ge i\) 的数字,\(a\) 序列剩 \(j\)\(\le\) 未决定填什么数,\(k\) 个数等待 \(>\) 的位置选择,\(b\) 序列同理,转移需要枚举两个序列选的个数,\(a\) 序列钦定几个,\(b\) 序列钦定几个,时间复杂度 \(\mathcal O(Vn^6)\)

而考虑那个题的另一种做法:容斥,将 \(>\) 容斥成 \(\le\),其他无限制任意填。

但是有个问题,那个题中任意填的可以最后决定,但是这题中剩下有几个任意填是需要知道的。

考虑在初始状态钦定全局选了几个任意填。

\(f_{i,j,k,p}\) 表示考虑 \(\ge i\),填了 \(j\) 个数,\(a\) 中剩下 \(j\) 个任意填没决定,\(b\) 中剩下 \(k\) 个任意填没决定。

转移先对 \(>i\) 的约束选择任意填或者容斥成 \(\le\)

然后再枚举两个序列选的个数,容易知道两个序列剩余可填位置个数,从中选择即可。

时间复杂度 \(\mathcal O(Vn^4)\)

生日礼物(birthday)

给定字符串,定义 \(f(m)\) 表示从串中选择若干长度为 \(m\) 的相等且不重叠子串的最多个数。

求所有 \(f(m)\)

\(n\le 10^5\)


先考虑单个 \(f(m)\) 怎么求:对长度为 \(m\) 的子串的等价类分别贪心从前往后选。

考虑用 SAM 优化,可以扫描线定位每个长度 \(m\) 子串的等价类,在上面维护上一个位置以及个数即可。

注意到 \(f(m)\) 单调递减,且 \(f(m)\le \frac{n}{m}\)

用经典分治即可做到 \(\mathcal O(n\sqrt n)\)

概率论(probability)

给定一个 \(n\) 个点的排列 \(p\),这个排列显然有 \(2^{n}-1\) 个非空的子序列。

请你对于每个 \(k\) 求出,在所有长度为 \(k\) 的子序列中,逆序对数的最小值。以及有多少个子序列取到了该最小值。

\(n\le 40\)


不妨考虑一个暴力,记录前面选择,插入一个点就计算比他大的数个数进入贡献。

发现一些状态是本质相同的,先拎出后缀还未考虑的点,我们显然只关心两个点之间的段中选的个数。

这样缩状态,可以证明数量为 \(\mathcal O(e^{\frac{n}{e}})\)

三元环(loop)

给定一个无限长的三角形坐标系。其中点 \((x,y)\) 右上方为 \((x,y+1)\),左上方为 \((x-1,y+1)\),右侧为 \((x+1,y)\)

如图所示:

每个整点上有一盏灯。最初只有 \((X,Y)\) 上的灯是开着的。

\(F\) 进行了有限次以下操作(可能是 \(0\) 次):

  • 选择任意整点 \((x,y)\),同时改变三元环 \((x,y),(x,y+1),(x+1,y)\) 的开关状态。

现在给定操作后灯的开关情况:共有 \(n\) 盏灯是开着的,第 \(i\) 盏为 \((x_i, y_i)\)。请你求出初始的 \((X,Y)\) 的坐标。

保证答案有解且唯一。

\(n\le 10^4,-10^{17}\le x_i,y_i\le 10^{17}\)


妙妙题。

先考虑一个暴力,我们可以做到将所有点缩到同一行上,显然答案只能在这一行上。

不妨证明答案点投影在这一行上也是相同的。

若他们不同,必然存在操作方式使得他们相同,而上面下面操作了就始终无法消除!

观察一个点往下投影的状态,发现这就是杨辉三角!为 \(1\) 的位置满足 \(x\) 差为 \(y\) 差的子集!

我们知道最左的 \(1\) 就是知道 \(X\)

考虑若 \(Y=0\),我们选取行为 \(-2^{60}+1\),这样所有 \(x\) 都是它的子集,可以在上面二分!!

对于一般情况,我们希望知道任意一个 \(1\) 的位置,这样求出最左最右 \(1\) 就能得到答案。

注意到最左就是 \(0\),最右就是 \(U\),以向左为例,枚举 \(i\),若 \(x-2^i\)\(1\),说明 \(x\) 差这一位就是一,否则就是 \(0\),减去之后一定不是子集。

向右同理,判断 \(x+2^i\)

(这也太神奇了!)

那么怎么找一个 \(1\) 呢,我们直接随机一行,再随机一个给出的点,得到这个点在这一行上的任意一个 \(1\),概率其实非常大。

王牌可樂(loca)

\(n\) 个可乐杯,容量分别为 \(c_1,\dots,c_n\) 单位体积,且均为正整数。

你只能进行如下操作:

  • 倒满一个可乐杯

  • 从一个可乐杯倒可乐到另一个可乐杯,当其中一个杯子空或者另一个杯子满时停止。

  • 将一个可乐杯清空

现在来了一位顾客,他想获得 \(w\) 单位体积的可乐。你需要通过仅有的 \(n\) 个可乐杯满足这位顾客的需求,使得其中一个杯子恰好有 \(w\) 单位的水。

\(n\le 10^5,c_i\le 2\times 10^5\)


先考虑 \(n=2\),不妨设 \(a>b\)

假设第一次操作位 \(0\to a\),那么下一次就是 \(a\to b\),如果 \(b\) 满,则只能 \(b\to 0\),否则 \(0\to a\)

不难发现可以做到 \((x+b)\bmod a,(x-b)\bmod a\),即在 \(\bmod a\) 环上可以取到所有 \(t\gcd(a,b)\) 位置。

求解 \(n\) 元一次不定同余方程 \(\sum_{i=1}^{n}x_ic_i=w\)

从后往前求解任意一组 \(x\),以 \(n\) 为例,转化成求解 \(t\gcd\{c_1,c_2,\cdots,c_{n-2},c_{n-1}\}+x_{n}c_{n}=w\)

求出 \(x_{n}\) 后,直接递归求解。

最后如果从操作的角度来说其实等价于 \(\sum_{i=1}^{n-1}x_ic_i\equiv w\pmod m\)。(这两个东西可以互相转化)

这样的话 \(x_i\) 就能通过加减若干倍 \(\frac{m}{\gcd(m,c_i)}\) 保持 \(\bmod m\) 的值不变的同时不会很大了。

其实也可以将最大的值转到 \(m\) 上,也能进行操作。

注意到只需选择 \(\log V\) 个数就能有解,则操作次数 \(\mathcal O(V\log V)\)

B(B)

给定 \(n\) 个点 \(m\) 条边的简单无向图 \(G=(V,E)\),考虑其补图 \(G'=(V,E')\),其中 \(E'=\{(u,v)|(u,v) \not\in E\}\)

请对于每个 \(k=1,2,\cdots,n-1\) 求出有多少无序点对 \((u,v)\) 满足 \(u\)\(v\)\(G'\) 上的最短路径长度为 \(k\)

\(n\le 5\times 10^4,0\le m\le\min(\frac{n(n-1)}{2},2\times 10^5)\)


若无边最短路为 \(1\)

否则有边,然后两点出边并集为 \(U\) 的话最短路 \(>2\)

考虑将点分成 \(<\frac{n}{2}\)\(\ge \frac{n}{2}\) 的部分,则小点已经考虑完了,剩下点对必然经过大点,共 \(\mathcal O(\sqrt m)\) 个。

我们只需以大小为起点跑补图的单源最短路。

维护未被访问过集合 \(S\),每次取出 \(u\),更新 \(S\) 中非 \(u\) 出边的点,\(S\) 更新成其中为 \(u\) 的出边的点的合计,则 \(|S|\le du_u\),因为 \(\sum |S|=\mathcal O(m)\)

另解:找到原图度数最小的点 \(u\),则任意 \(x,y\) 均不与 \(u\) 相邻,最短路 \(\le 2\),只需以 \(u\) 及出边为起点跑最短路,而且最小度数为 \(\mathcal O(\sqrt m)\)

C(C)

初始有一堆共 \(n\) 个石子,双方轮流行动,每次可以从石子堆中取走若干个石子,Alice 先手。

记当前石子数量为 \(x\),则行动方必须取走至少一个、至多 \(S(x)\) 个石子,其中 \(S(x)\) 表示 \(x\) 在十进制下的各位数字之和,取完所有石子的人获胜。

\(T\le 5\times 10^5,n<10^18\)


不难根据 SG 函数的暴力得到一个过程:记录上一个 \(0\) 位置 \(x\),则下一个 \(0\) 位置 \(y\) 为第一个满足 \(y-S(y)>x\)

直接数位 dp 优化,记 \(f_{u,j,k}\) 表示剩下后 \(u\) 位,前面数位和为 \(j\),上一个 \(0\)\(0000\) 的距离为 \(k\) 的情况下的 \(0\) 个数和,以及上一个 \(0\)\(9999\) 的距离。

而没顶住上界的状态可以预处理,顶住上界的状态只有 \(18\) 个。

D(D)

给出一棵树,带点权。

求一组连通块划分,使得每个连通块次大值的和最大。

\(n\le 5\times 10^5\)


注意到连通块形态为链,两端分别为最大值和次大值。

直接考虑树上 dp,记 \(f_{u,x}\) 表示 \(u\) 子树,\(u\) 属于的链另一个端点权值为 \(x\)\(g_u\) 表示子树最优答案。

初始 \(f_{u,w_u}=w_u\)

\[f_{u,x}\leftarrow \max(f_{u,x}+\sum_vg_v,f_{v,x}+\sum_{v'\ne v}g_{v'})\\ g_u\leftarrow \max(g_u,f_{u,x}+f_{v,y}+\min(x,y)) \]

经典线段树分治了。

(能不能别看到横跨的链就不去想树上 dp 啊??)

sakura(sakura)

给定长度为 \(n\)、由 \(0,1\) 构成的序列 \(a\)

你需要回答 \(q\) 个问题:

给定 \(k\) 个下标 \(s_1,\dots,s_k \in [1,n]\)

你需要进行若干次以下操作,把 \(k\) 个下标分别变为 \(t_1,\dots,t_k \in [1,n]\)

  • 选定 \(1\le i\le k\)\(d\in \{1,-1\}\),执行 \(s_i\gets s_i+d\)。你需要保证新的 \(s_i\) 仍满足 \(s_i \in [1,n]\)
  • 操作的代价为操作前\(\bigoplus_{i=1}^k a_{s_i}\)。其中 \(\bigoplus_{i=1}^k a_{s_i}\)\(a_{s_1},\dots,a_{s_k}\) 中有奇数个 \(1\) 时为 \(1\),否则为 \(0\)

求使 \(s_i=t_i,\forall i\) 的最小代价总和。

\(n\le 10^6,q\le 10^5,1\le k\le 5\)


全都想到了,但是就是写不出代码。

不妨先枚举第一步和最后一步怎么走,使得起点终点异或和为 \(0\)

\(p_i\) 表示 \(s_i\to t_i\) 经过几个连续段。

现在需要将 \(p_i\) 变成 \(0\),每次可以用 \(1\) 代价匹配两个 \(p_i\),也可以在 \(010\)\(101\) 处用 \(1\) 代价将 \(p_i\) 减去 \(2\)

  • \(p_i\) 没有绝对众数,那么直接两两匹配消掉即可,答案为 \(\frac{\sum{p_i}}{2}\)
  • 否则:剩下 \(p_{mx}\) 消不掉,如果 \(mx\) 出现了 \(01\) 交替段,就能 \(1\) 代价减去 \(2\),到最后还用让其他数左右移动,让其 \(1\) 代价减去 \(1\)

camellia(camellia)

给定正整数 \(n,m\) 和长度为 \(n\) 的非负整数序列 \(b_1,\dots,b_n\) 满足 \(0\le b_i < m\)

定义 \(f(a,M)\) 为以下问题的答案:

给定正整数 \(M\),保证 \(a_i< M\)

你可以对序列 \(a\) 进行若干次以下操作:

  • 选定 \(1\le l\le r\le n\)\(c\in \{1,-1\}\),对于所有 \(i\in [l,r]\),执行 \(a_i\gets (a_i+c)\bmod M\)

求把序列 \(a\) 变为 \((0,0,\dots,0)\) 所需要的最少的操作次数。

你需要回答 \(q\) 个询问,每个询问给定参数 \(d,t\)

  • \(a\) 为长度为 \(n\) 的序列。若 \(b_i\ge t\),令 \(a_i=b_i+d\);否则,令 \(a_i=b_i\)。求 \(f(a,m+d)\)

\(n,q\le 2\times 10^5,1\le m\le 5\times 10^8,0\le b_i<m,1\le d\le 5\times 10^5,1\le t\le m\)


不妨先考虑没有取模时的问题,根据贪心,答案显然为序列前后各插入一个 \(1\) 后长度为 \(n+1\) 的差分序列的绝对值之和。

加入取模,发现相当于令原序列若干数 \(+m/-m\),即差分序列令若干数 \(+m/-m\),保证加减的个数相同,代价依旧是绝对值之和。

不难发现一个位置最多 \(+m/-m\)\(-v\to m-v\) 可以使代价加上 \(m-2v\)\(v\to v-m\) 可以使代价加上 \(m-2v\)

发现代价相同!!所以可以将所有数按照操作代价排序,选择正负数相同个数进行操作,不难发现贡献函数是凸的,可以一直去到最大的正负数代价和 \(\le 0\) 的位置。

直接写就有 \(\mathcal O(n\log ^3 n)\) 的做法。

考虑二分正数最优的第 \(k\) 大值,可以简单判断对面是否存在 \(k\) 个数跟他的和 \(\le 0\),这样就能确定他值。

反过来同理,也能确定负数的值。

再考虑这题的操作,显然被加的数始终是大数,则差分值的正负性是很好确定的,处理 \(d\) 对差分值的影响也是容易的。

时间复杂度 \(\mathcal O(n\log^2n)\)

异形工厂

给定两个 01 字符串 \(a, b\),每次可以选中 \(a\) 中一个长为 \(3\) 的子串进行左或右循环移位,问将 \(s\) 变成 \(t\) 的最小操作次数。

多组区间询问。

\(n,q\le 5\times 10^5\)


首先操作可以看成交换 \(a_i,a_{i+1}\) 或交换 \(a_i,a_{i+2}\)

考虑前缀和之差,如果只能交换长度为 \(1\) 的,答案显然是 \(s_i\) 的绝对值之和,这是因为每次可以选择一个位置加一或者减一,并且不会反向操作。

同理添加长度为 \(2\) 的操作,当 \(s_i,s_{i+1}\) 同号时,可以同时加一或者减一。

那么以 \(0\) 为分界点每段是独立的,且每段同号。

问题转化为:每次可以单点减一,也可以选择相邻减一,求最小操作数。

显然操作二越多越好,最多就是最大匹配,因此可以得到,最小操作数就是最大权独立集。

接着考虑区间查询,需要查询区间 \(-s_{l-1}\) 后绝对值的最大权独立集。

考虑对图扫描线,每次全局 \(+1\),只看当前 \(> 0\) 的位置,维护最大权独立集的选取方案

询问 \([l,r]\) 时,这个区间一定被 \(0\) 分割,所以这时的方案就是最优方案。

将其按照开头,结尾以及 \(01010\) 段分开来看,对于这些段,最优方案一定要么是 \(01010\),要么是 \(10101\) 且存在后缀时间变成后者。

对于每个子段处理出变换的时间扔进队列,每次取出来左右合并出新的 \(01010\) 段即可。

时间复杂度 \(\mathcal O(n\log n)\)

实现细节:

  • 初始每个点为一段,加入一个点时,即修改对应段的和以及变化时间,注意不用修改,直接加入队列,弹出时判断即可。
  • 翻转段时,直接将其与前面后面段合并即可,每个段的形态要么是单个未加入的 \(0\),要么是 \(01010\)
  • 开头结尾都存在一个负无穷的 \(0\),也可以参与合并。

B(B)

给定由大小写字母构成的字符串 \(s,t\)

\(n\) 种操作,第 \(i\) 种操作包含两个等长的字符串 \(a,b\),表示若 \(a\)\(s\) 的后缀,则可以将 \(s\) 的该后缀替换为 \(b\)。求使得 \(s\) 变成 \(t\) 的最小操作次数,或报告无解。

\(T\le 1000\),所有字符串长度 \(\le 20\)\(n\le 20\)


不妨考虑替换长度的前缀最大值,条件就是当前长度要替换成下一个长度的等价位置,且下一个长度多出来的部分要与开头相等。

这样相邻两个前缀最大值之间就是个子问题,所以不妨设 \(f(x,y)\) 表示将 \(b_x\) 变为 \(a_y\) 的最小操作次数,只考虑后 \(\min(|b_x|,|a_y|)\) 的长度。

先处理处 \(b_x\to a_y\) 能以 \(j\) 作为倒数第一个中转点的条件就是要求 \(x,y\) 的 lcp 有下界。

floyd 松弛的正确性,以任意顺序枚举中转点,\(x\to y\) 的最短路径上已经枚举过的点构成的连通块的最短路已经知道了,新加点只需枚举所有点对松弛。

而在本题中,中转点需要按照长度从小到大枚举,因为子问题的长度更小,而同一长度的分析还是类似 floyd。

C(C)

你有一个长为 \(2^n\) 的整数序列 \(p_0,p_1,\cdots,p_{2^n-1}\)。其初始值由以下方式生成:

  • 给出 \(a_0\sim a_{n-1}\),则 \(p_i=\sum_{j\in S_i} a_j\),其中 \(S_i\)\(i\) 的二进制表示下所有 \(1\) 的位置构成的集合。

接下来有 \(q\) 次对该序列的修改/查询,格式如下:

  • 1 l r x,其中 \(0\le l\le r<2^n\),表示将下标位于 \([l,r]\) 中的所有 \(p_i\) 加上 \(x\)
  • 2 l r,其中 \(0\le l\le r<2^n\),表示一次询问。你需要求出 \(\sum_{l\le i<j<k\le r} p_i\cdot p_j \cdot p_k\),也即在区间中无序地任选三个下标 \((i,j,k)\),求其 \(p_i\) 的乘积之和。由于答案可能很大,输出其对 \(998244353\) 取模后的值。

\(n\le 100, q\le 2\times 10^4\)


太典了。

考虑使用动态开点线段树维护,每个节点维护形如 \(\sum_{i<j<k}(p_i+x)(p_j+x)(p_k+x)\) 的所有系数,大标记直接函数复合即可。

而对于空节点的系数可以直接数位 dp 记忆化求出。

D(D)

神树(tree)

给出一棵 \(2n\) 个点树,每种颜色恰好出现两次,可以执行任意次操作:选择两个之前未被选过的节点,交换两个节点上的宝石,使得边上两点颜色相同数量最多,并构造方案。

\(n\le 2\times 10^5\)


注意到答案上界是最大匹配。

猜测,通过了大样例。

如果最大匹配的点上每种颜色恰好出现两次,每次找到一种颜色 \(x -y,x-z\),将 \(x,y\) 交换;再对 \(y\) 进行考虑,正确性考虑建出图来,形成若干个环,每次可以消掉一个环。(两个一边就考虑建图!!!)

对于任意情况,将链的一头换成另一头的颜色就变成环了,并从这里断开进行操作。

道路(road)

造迷宫(make)

一个迷宫被定义为一个 \(n\times m\) 的网格图,每个格子 \((x,y)\) 都能通过一扇门走到 \((x+1,y),(x,y+1)\)

找出所有可能的从 \((1,1)\)\((n,m)\) 的路径,假设数目为 \(t\)

告诉你 \(t\),你需要任意构造一个合法的迷宫。

你需要保证 \(1\leq n,m\leq l\),坏掉的门的个数不超过 \(p\)

\(l=50, p=300, t\le 10^{18}\)


注意到 \(2\times 2\) 可以将路径数 \(\times 2\),在旁边引入一个 \(1\),可以做到 \(\times 2+1\)

但是这样一直往右下放网格不够了。

考虑 \(3\times 3\),可以将路径数 \(\times 6\),现在需要构造 \(+1\sim +5\)

不难发现上边左边各两个边界可以放开,分别可以 \(+1,+2\)

依旧往右下构造即可。

树上距离(dis)

树上有 \(n\) 个点,边有边权。在 \(n\) 个点当中找 \(k\) 个,使得这 \(k\) 个点两两之间距离和最大。

\(k\le n\le 2\times 10^5\)


直接 dp,将贡献放在边上,就是每次加上一个上凸函数,并做 \((\max,+)\) 卷积。

直接猜测就是凸的。

使用平衡树打标记维护即可。

移球游戏(game)

给定一棵 \(n\) 个点的树,一开始每个点上都恰好有一个小球。

每次你可以选择两个相邻的位置,满足这两个位置上的小球个数相同,然后将其中一个位置的所有小球移到另一个位置。

你可以在任意时刻(包括一开始)停止操作。请求出最终局面数。两个局面不同,当且仅当存在一个点使得两个局面中这个点上放置的小球数量不同。答案对 \(10^9 + 7\) 取模。

\(n\le 3\times 10^5\)


考虑每个点旁边的边一定满足选了一个值域前缀加进来,然后可能会有一条边将所有值送出去。

而这样每一种合法的送值方案,唯一对应一种最终局面,因为将没有移动的边删除后,每个连通块是一棵内向树,恰好一个位置有值。

\(f_{i,j},g_{i,j},h_i\) 表示 \(i\) 上传了 \(2^j\) 个球,父亲下传了 \(2^j\) 个球,\(i\) 和父亲之间的边断开的方案数。

转移对儿子的边进行状压 dp 即可。

考虑优化,将子树按照 \(sz\) 从小到大排序,轻儿子的转移正确,而重儿子不能超过之前的两倍。

此时复杂度正确。

字符串(string)

定义一个字符串 \(t\) 能够匹配字符串 \(s\) 当且仅当 \(t\)\(s\) 的子串,且 \(t\) 可以超出头尾的,可重叠的覆盖 \(s\)

给定长度为 \(n\) 的字符串 \(s\),求有多少种本质不同的 \(t\) 能够匹配 \(s\),并求出最短的 \(t\)(如果长度相同,字典序越小的越优)。

形式化定义匹配:一个串 \(t\) 能够匹配长度为 \(n\) 的字符串 \(s\),当且仅当 \(t\)\(s\) 的子串,且能够选出若干区间 \([l_1, r_1], [l_2, r_2], \dots , [l_k, r_k] (l_i \le l_{i+1}, r_i \le r_{i+1})\),使得这些区间的并为 \([1, n]\),并且:\(s_{l_1 \dots r_1}\)\(t\) 的后缀,\(s_{l_k \dots r_k}\)\(t\) 的前缀,\(s_{l_i \dots r_i}(1 < i < k) = t\)

\(n\le 2\times 10^5\)


首先对一个等价类考虑条件是 edp 之间要覆盖,开头要存在 border 与第一个 edp 有交,且 \(\le len\);结尾也要存在 border 与最后一个 edp 有交,且 \(\le len\)

考虑优化,对于开头,注意到 $len \ge $ 前面间距的一半,如果 border \(<\) 一半,必然交不起来;否则,只需判断是否 \(\le len\)

对于结尾同理,不过这是条件变成了给定 \([l,r],k\),找 \(border(s_{i\cdots n})\ge n-k\)\(i\in [l,r]\) 的位置个数以及最大值,主席树维护即可。

对于第二问,使用 SA 比较字典序即可。

序列(seq)

给定一个长度为 \(n\) 的的序列 \(a\)。从中选择 \(m\) 个数,将选择的元素按原顺序排成一个首尾相邻的序列 \(b\),此时,我们定义 \(b\) 的权值为所有相邻两个数之和的最大值(形式化地,权值为 \(\max_{i=1}^{m}\{b_i+b_{(i\bmod m)+1}\}\))。求出 \(b\) 的权值最小能为多少。


QOJ970 是这题的区间查询版本。

二分答案,分为小数和大数。

使用调整法可以发现,存在方案使得所有小数被加入,而中间的大数直接看情况贪心加入即可。

???

航班(flight)

\(n\) 个城市,编号为 \(0,1,\cdots,n-1\),它们被 \(n-1\) 条双向道路联通(形成一棵树),第 \(i\) 条道路连接城市 \(u_i,v_i\),长度为 \(w_i\)

任意两个不同的城市之间都有航班。

但是,从每个城市出发的航班,收费标准都不同。若你从第 \(j\) 个城市出发,飞行到城市 \(k\),记二者在树上的距离为 \(dist(j,k)\),你将被收取 \(a_j +dist(j,k) \times b_j\) 的费用。

求从城市 \(0\) 出发,到每个城市的最小费用。

\(n\le 10^5,0\le a_i\le 10^12,0\le b_i\le 10^6,1\le w_i\le 10^6\)


朴素做法不讲了,讲一个不用 \(b_i\) 单减这个性质的做法。

考虑 dij,每次取出最小值,标记他已经被松弛完毕了,使用他松弛所有能松弛的位置。

使用点分治,他能松弛 $\log $ 个节点上的所有点,但我们肯定不能加入所有点,不妨只加入 dis 最小的未被标记的点进入队列(因为只有当他被标记了,后面的点才能被标记),这样只需要将前面的所有松弛操作缓存下来,当这个节点的某个值被标记时,直接将 dis 最小的未被标记节点进行全部松弛后加入队列。

对于缓存松弛操作,维护一个凸包或者一个李超树即可。

方格染色(matrix)

lycoris(lycoris)

最大值可爱捏(max)

树(tree)

https://www.luogu.com.cn/problem/AT_arc152_f

Kyu-Kurarin

姬路市仙人掌(trans)

posted @ 2025-12-07 19:09  蒟蒻orz  阅读(85)  评论(0)    收藏  举报