多么想让你听见,这颗破碎又顽强的心

May Solution Set Part One

篱笆

实际上,我们采用不等式法去逼近我们的答案。

先考虑是链的情况。

\(a_i\) 表示原区间左端点,\(f_i\) 表示最优解左端点,\(len = 2r\)\(ans\) 表示答案,\(all\) 表示整个区间。

那么容易得到:

\[f_i = \min(f_{i-1} + len , a_i + ans) \\ f_i = \min(f_{i + 1} - len , a_i - ans) \]

且有 \(f_i \geq a_i - ans\)

将该式子带入第一个方程,可以得到:

\[a_j + ans + (i - j) \times len \geq a_i - ans \\ ans \geq \frac{a_i - a_j - (i - j) \times len}{2} \]

又有 \(f_l \leq 0\),所以有:

\[a_i - ans - (i - l) \times len \leq 0 \\ ans \geq a_i - (i - l) \times len \]

又有 \(f_r \geq all - len\),所以有:

\[a_i + ans + (r - i) \times len \geq all - len \\ ans \geq all - len - a_i - (r - i) \times len \]

满足这三个条件应该就做完了。

然后是环的情况。只要保证任意相邻两个数之间都满足条件即可。

\[ans \geq \frac{a_i - a_j - (i - j) \times len}{2} \ \ (l \leq j \leq i \leq r) \\ ans \geq \frac{a_i + all - a_j - (i + r - l + 1 - j) \times len}{2} \ \ (l \leq i < j \leq r) \]

Answer 的排队

定义 \(f_{i,j}\) 表示决定了前 \(i\) 个数字,最后一个的大小为已确定中第 \(j\) 大的。

转移很容易。第一种转移等价于滚前缀和。另一种等价于滚后缀和。

那么用生成函数容易处理。有没有不用多项式的做法?

题解用的多项式,多项式还要你教我?

「DTOI-5」#1f1e33

本来计划打这场的,但因为事情耽搁了,晚上来看了看,推着很复杂,但其实每一步不是套路就是通过简单的观察得到。

\[f(n) = \sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n [i + j + k = n] \operatorname{lcm} (i , \gcd(j , k)) \\ f(n) = \sum_{j=1}^n\sum_{k=1}^n\sum_{i=1}^n [i + j + k = n] \operatorname{lcm} (i , \gcd(j , k)) \\ f(n) = \sum_{d=1}^n \sum_{i \equiv n \bmod d}^n \operatorname{lcm} (i , d) \sum_{j=1}^{\frac{n-i}{d}} [\gcd(j , \frac{n - i - jd}{d}) = 1] \\ f(n) = \sum_{d=1}^n \sum_{i \equiv n \bmod d}^n \operatorname{lcm} (i , d) g(\frac{n-i}{d}) \\ f(n) = \sum_{d=1}^n \frac{1}{\gcd(d,n)} \sum_{i \equiv n \bmod d}^n i \times d \times g(\frac{n-i}{d}) \]

其中:

\[g(n) = \sum_{i=1}^{n-1} [\gcd(i , n - i) = 1] \\ g(n) = \sum_{i=1}^{n-1} [\gcd(i , n) = 1] \\ g(n) = \varphi(n) \]

\[f(n) = \sum_{d=1}^n \frac{d}{\gcd(d,n)} \sum_{i \equiv n \bmod d}^n i \times g(\frac{n-i}{d}) \\ f(n) = \sum_{d=1}^n \frac{d}{\gcd(d,n)} (n\sum_{p=1} \varphi(p) - d\sum_{p=1} \varphi(p)p ) \\ f(n) = \sum_{d=1}^n \frac{d}{\gcd(d,n)} (nS_{1}(\frac{n}{d}) - dS_2(\frac{n}{d})) \\ f(n) = \sum_{T|n} \sum_{d=1}^{\frac{n}{T}} d[\gcd(d,\frac{n}{T})=1] (nS_{1}(\frac{n}{dT}) - dTS_2(\frac{n}{dT})) \\ f(n) = \sum_{T|n} n(\sum_{d=1}^{\frac{n}{T}} d[\gcd(d,\frac{n}{T})=1]S_{1}(\frac{n}{dT})) - T(\sum_{d=1}^{\frac{n}{T}}d^2[\gcd(d,\frac{n}{T})=1]S_2(\frac{n}{dT})) \\ f(n) = \sum_{T|n} n \times h_1(\frac{n}{T}) - T \times h_2(\frac{n}{T}) \]

其中:

\[h_1(n) = \sum_{d=1}^n d [gcd(d , n) =1] S_1(\frac{n}{d}) \\ h_1(n) = \sum_{D|n} D\mu(D) \sum_{d=1}^{\frac{n}{D}} d S_1(\frac{n}{dD}) \\ h_1(n) = \sum_{D|n} D\mu(D) val_1(\frac{n}{D}) \]

\[h_2(n) = \sum_{d=1}^n d^2 [gcd(d , n) =1] S_2(\frac{n}{d}) \\ h_2(n) = \sum_{D|n} D^2\mu(D) \sum_{d=1}^{\frac{n}{D}} d^2 S_2(\frac{n}{dD}) \\ h_2(n) = \sum_{D|n} D^2\mu(D) val_2(\frac{n}{D}) \]

然后 \(val_1\)\(val_2\) 可以通过枚举 \(d\) ,发现大量的元素 \(\frac{n}{d}\) 相同,于是通过差分前缀和可以在调和级数复杂度解决。

同样的,\(h_1\)\(h_2\) 可以通过调和级数枚举因子解决。

「DTOI-5」进行一个排的重 (Maximum Version)

看题目名还以为是构造题 /hsh。

我们要整个序列两部分分别的前缀最大值总数最大,还要算方案。

先按 \(p\) 排序。

考虑从第 \(x\) 个数到第 \(y\) 个数(\(x < y\) ,且钦定他们都是前缀最大值),他们之间的数都是填在 \(x\) 个后面的,所以他们不妨从小到大排序过后再填到后面去。比 \(\max(p_x , p_y)\) 小的数在后面可以随便插入,否则就得从小到大填。那么实际上,答案的大小就只与 \(p\) 的前缀最大值的选择有关系。

那么,我定义 \(f_i\) 表示从前往后,第 \(i\) 个为 \(p\) 的前缀最大值时,最大的权值。

于是我们就把最大值先算出来了,但还要计算方案数。

就是说,假定我已经选定了我 \(p\) 的前缀最大值是哪些位置。


我去,第一问的答案是按 \(p\) 排序后的 \(q\)LIS 加上 \(n\)

因为,考虑将那些 LIS 位置提出来,剩下的找到那些会阻止 LIS 成为极大值的元素拉出来插入到后面合适的位置,那么就容易发现有着 \(n + \operatorname{LIS}\) 的权值。容易发现这是最大的。

那么现在会影响方案的就是 LIS 的选择和插入的位置。

实际上可以从后往前,实现用插板法费用提前计算。

[JSOI2010]旅行

这个东西,实际上跟边的条数有关系。

分为边数小于等于 \(k\) 和边数大于 \(k\)

如果存在边数小于等于 \(k\) 的路径,则答案确定。

否则,枚举一个阈值 \(v\) ,表示不超过这个阈值的边去完成替换,定义 \(dis_{x,i,j,w}\) 表示 \(v\) 以内的边选了 \(i\) 条,需要被替换的边选了 \(j\) 条,阈值为 \(v\) 的边选了 \(w\) 条的情况下,最小的其他边的总量是多少。其中,我们要求 \(i + j \leq cnt_v\)。其中 \(cnt_v\) 表示不超过阈值 \(v\) 的边的总数。然后就可以统计贡献。

[HAOI2018]反色游戏

太经典啦!先生成一个 dfs 树,然后除了树边,其他边都可以瞎选。但是这样有可能会让我们的根节点不能变成白色。那么我们对于整体,可以做一个 dp,定义 \(f_{x,0/1,0/1}\) 表示当前点的颜色为 0/1 且下面对根节点的影响为 0/1 的方案总数。转移就是做容量为 1 的背包。

我是哈卵,每条边的作用量一定是偶数,则初始时有奇数个 \(1\) 则最后就有奇数个 \(1\) ,偶数同理。

所以答案就很简单了,主要是判断有无解。那么就是删除一个点后,每个连通块内都有偶数个 \(1\) 则有解,否则无解。

我直接线段树分治,并查集计算。做完了。

[CTSC2018]青蕈领主

这个,感觉有点像什么连续段 dp。像是合并连续段之类的。

极长连续序列之间,只会有包含和相离关系,因此是一个树形结构。

不如想部分分。

对于 \(L_j = j\) 的部分分,就是要么往左边加一个要么往右边加一个,答案就是 \(2^n\)

对于 \(L_j = 1(j < n)\) 的部分分。


开始贺题解。

定义 \(f_n\) 表示 \(L_i = 1 \ (i \in [1 , n])\)\(n + 1\) 阶排列数量。

发现一个区间内的方案数与外部独立,因此只用考虑计算每个点儿子的大小分配情况即可。

Tiw 告诉我们正难则反,考虑容斥,用总的 \((n+1)!\) 的方案减去儿子个数小于 \(n\) 的方案。

那么定义 \(G(x) = \sum_{n>0} n!x^n\) ,则有 \(f_n = (n+1)! - \sum_{i=1}^{n-1}f_i [x^n]G^i(x)\)

麻了,不会生成函数,不如组合意义。

这个 \(f_n\) 其实也等价于,连续区间要么包含最大值 $n + 1 $,要么长度为 \(1\)\(n + 1\) 阶排列。

尝试去递推。

首先如果原排列合法,我们考虑去插入最小值,只要新最小值不插入在原最小值旁边即可。

所以有 \((n-1)f_{n-1} \rightarrow f_n\)

如果原排列不合法,此时只有一个极大的不经过最大值的长度为 \(l\) 连续区间。

该区间值域为 \([x,x+l-1]\) ,则 \(2 \leq x \leq n - l\) ,所以 \(x\) 的取值有 \(n - l - 1\) 种。

我们需要将 \(1\) 插入进去,插入进去后我们需要所有不经过 \(1\) 的区间不连续,将 \(1\) 视作极值,则方案数为 \(f_l\)。然后把区间缩起来,大小插入到他原本的大小位置,然后因为他是唯一的极大且不经过最大值的连续区间,所以方案数为 \(f_{n-l}\)

所以有递推式:

\[f_n = (n-1)f_{n-1}+\sum_{i=2}^{n-1} (n-i-1)f_if_{n-i} \\ f_0 = 1,f_1 = 2 \]

之后应该只用分治 NTT 即可。

图腾totem

发现三种结构都包含一种特定结构:小大中。

闪电是在该结构右边加上最大值。

A山峰是在该结构左边加上极小值,B山峰是在右边加上次小值。

A山峰似乎是易于计算的,从大到小枚举点,然后记录递减结构,就容易计算。

B山峰应该可以从大到小枚举点,记录三连递减结构和二连递减结构

不如观察,发现一个 闪电 右边的比最大值小的点一定可以与闪电中的三个点形成山峰。


容斥,易得:

	1324 - 1243 - 1432
   =13xx - 1342 - 12xx + 1234 - 1xx2 + 1342
   =13xx - 12xx + 1234 - 1xx2
   =13xx + 1234 - 1xxx + 1x2x

剩下的每一个都可以用容斥容易算出。

[SDOI2017] 龙与地下城

生成函数随便推一下即可。但目测精度飞了。

生成函数的结果写一下:

\[\frac{1}{a^Y} \frac{1}{(1-x)^Y} (1-x^X)^Y \]

然后滚个前缀和就可以算。

但是精度确实飞了。

实际上是一个定理的板子题。

中心极限定理推论
  • 对于 \(n\)独立同分布 的随机变量,\(x_1,x_2,\dots,x_n\),若 \(E(X)=\mu\)\(D(X) = \sigma^2\),令 \(Y = \frac{\sum_{i=1}^nX_i-n\mu}{\sqrt{n\sigma^2}}\),当 \(n\) 足够大了,则 \(Y \sim N(0,1)\)

这个定理相当强大,听说,数学书上有,待会儿去求证一下。

有了这个定理,我们只用小数据暴力卷积,大数据套用自适应辛普森积分法。

[JSOI2018]机器人

憨笑,题解大部分证明是错的,只有一篇题解只有一个小错误,乐死我了。

计数题的本质是推性质。

遍历整个网格,哈密顿回路计数,此题必有高论。

结论1:属于同一副对角线的两个格子方向必然相同

因为相邻两个同一副对角线上的元素如果不同,则中间夹的元素就走不到。

相邻定义为往左一步再往下一步。

可以发现是易于理解的。

结论2:机器人的动作是循环的,并且循环节是 \(\gcd(n,m)\)

因为每个副对角线的动作是相同的,所以必然存在循环节,且至少是 \(\max(n,m)\)

但更确切地说,是 \(\gcd(n , m)\)。因为只有 \(\gcd(n , m)\) 种颜色。

继续分析。

设循环节长度 \(d = \gcd(n , m)\) ,循环节内向下走的次数是 \(\Delta x\) ,向右走的次数是 \(\Delta y\)

则纵坐标回到 \(1\) 的时间是 \(d \times \frac{\operatorname{lcm}(\Delta x ,n)}{\Delta x}\),横坐标第一次回到 \(1\) 的时间是 \(d \times \frac{\operatorname{lcm}(\Delta y ,m)}{\Delta y}\)

又因为第一次回到 \(1\) 的时间点必须是 \(nm\) 才能保证走完每个点。

所以有方程:

\[d \times \operatorname{lcm} (\frac{\operatorname{lcm}(\Delta x , n)}{\Delta x},\frac{\operatorname{lcm}(\Delta y , m)}{\Delta y}) = nm \]

不妨考虑去化简它:

\[d \times \operatorname{lcm} (\frac{n}{\gcd(\Delta x , n)},\frac{m}{\gcd(\Delta y , m)}) = nm \\ \gcd(\Delta x , n) \gcd(\Delta y , m) \gcd(\frac{n}{\gcd(\Delta x , n)} , \frac{m}{\gcd(\Delta y , m)}) = d \\ \gcd(\frac{n}{d}\gcd(\Delta y , m) , \frac{m}{d}\gcd(\Delta x , n)) = 1 \]

所以式子里面两坨东西是互质的。由定义可得:\(\gcd(\frac{n}{d} , \frac{m}{d})=1\)

所以可以得到:

\[\gcd(\Delta x , \Delta y , n , m) = 1 \\ \gcd(\Delta x , \Delta y) = 1 \]

由此容易得到 \(\gcd(\Delta x , d) = \gcd(\Delta y , d) = 1\)

所以抽调其他部分:

\[\gcd(\frac{n}{d} , \gcd(\Delta x , n)) = 1 , \gcd(\frac{m}{d} , \gcd(\Delta y , m)) =1 \]

所以容易得到使得方案合法的充分必要条件就是:

\[\gcd(\Delta x , n) = 1 \\ \gcd(\Delta y , m) = 1 \\ \]

因为可以注意到 \(\gcd(\Delta x , \Delta y) = 1\) 被上述两个条件严格包含。

这就是 结论 3。’

当然,方案数是易于计算的,即 Sub2 是容易解决的。

先把所有障碍分组。然后只处理第一个循环节。然后把走的步数加入我们的状态。

则,先枚举一个循环节向下走多少步,然后定义 \(f_{x,y,d}\) 表示当前在格子 \((x,y)\) ,并且能够走到的最近的障碍需要多少步。

因为从同一个组到该组的其他位置一定走过整的循环节。复杂度是 \(O(n^5)\)

实际上,我只需要同时记录当前答案和方案数,就可以把 \(d\) 改写为经过多少整循环节。

复杂度 \(O(n^4)\)

[GXOI/GZOI2019]宝牌一大堆

既然,不用考虑算重的问题,那就可以随便枚举策略。

直接 dp 即可。

[CTSC2011] 字符串重排

最大价值优解是容易求的,就是排序后的结果。

因为每个元素的前面那个元素都是与它的 LCP 最大的那个字符串。

显然题目的意思就是让我们从后往前依次检查每个限制能否满足。

本质上就是钦定一个字典树的访问顺序,使得满足上述条件。

就是说,我们可以按任意顺序去访问儿子节点和其自身。

于是我们依次考虑每个询问,根据每个询问去确定一些访问顺序。

包括,每个点进入后第一个访问什么,最后一个访问什么,访问完一个儿子后访问哪一个儿子。

定义 \(pnxt_v\) 表示 \(x\) 访问完儿子 \(v\) 后下一步访问哪一个儿子。如果是 \(-1\) 表示访问完后就退出。

检查就是直接树剖检查,线段树上的元素 \(1\) 表示最后一个访问的是重儿子,\(2\) 表示最先访问的是重儿子,\(4\) 表示最先访问的不是重儿子,\(8\) 表示最后访问的不是重儿子,\(0\) 表示不确定,维护一个区间或运算

如果是询问 \((u,v,lca)\),则 \(u \rightarrow lca\) 是最后一个访问哪里确定穿了,必须检查非交界处的区间或值是 \(4\)\(5\)\(1\)\(0\)

\(lca \rightarrow v\) 则是第一个访问哪里确定穿了,必须检查非交界处的区间或值是 \(10\)\(8\)\(2\)\(0\)。。而且在路径上 \(lca\) 的儿子位置,会确定一个 \(pnxt_v\) ,注意 \(lca\) 的最先访问什么,最后访问什么不会确定。

但是暴力跳能过,所以我就写了暴力跳(雾。

CF1823F Random Walk

很明显,每个点与其四周的点可以形成等量关系。

当然这个关系需要讨论,如果该点 \(x\) 子树内不包含 \(t\),则其期望被经过次数 \(c_x\) 为:

\[c_x = \frac{c_{fa_x}}{deg_{fa_x}} + c_x \times \frac{deg_{x} - 1}{deg_x} \]

这明显是一个仅关于其父亲的式子。那么我们不妨以 \(t\) 为根。

\(t\) 邻接的点单独算。其余的点直接递推。注意在 \(s \rightarrow t\) 路径上的点需要额外加上起点在 \(s\) 的贡献。

Clarke and math

转化一下题意就是说求做 \(k\) 遍高维前缀和的结果。

本来,做 \(k\) 遍前缀和是要用卷积的,但是,现在每一维都只有 \(\log\) 位,这个是问题的关键。

Misaka Network 与求和

这个 \(f\) 函数真的相当难以处理。那我先把他线性筛了。

然后带着他去推式子。

\[\sum_{i=1}^n\sum_{j=1}^n f^k(\gcd(i,j)) \\ \sum_{d=1}^n f^k(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [\gcd(i,j) == 1] \\ \sum_{d=1}^n f^k(d) \sum_{T=1}^{\lfloor \frac{n}{d} \rfloor} \mu(T) \lfloor \frac{n}{dT} \rfloor^2 \\ \]

是筛子题,咕咕咕。

CF1824C LuoTianyi and XOR-Tree

我改变一个非叶子节点,需要带来优惠,当且仅当,子树内存在两个叶子,他们到当前点的权值是相同的,则建议去修改这个位置的值。但是,这么做会让其他叶子被彻底定型,不再能够通过上面的变换来改变。

于是我们把在一步操作内归为 \(0\) 的叶子视作等价类,等价类之间张成的路径连通块没有交点。

因此,可以考虑树形 \(dp\)

不妨考虑线段树合并去维护 dp

那么 \(dp_x\) 就可以是 \(\sum dp_v\) 和线段树维护值中的较小值。

[SDOI2018]反回文串

\(n,k\) 巨大,同时模数非质数。

我猜测需要使用 burnside 定理。然后可以得到一个比较粗暴的式子。去,完全不对。

集合与运算不具有封闭性,所以完全不能这么算。

但是可以去枚举最小循环节去计算,然后把含该最小循环节的本质不同回文串个数乘以最小循环节长度加起来就是答案。

但是,当最小循环节为偶数的时候可能会遇到问题。就是我们计算出的循环节前后对调这两个东西本质相同但被计算了两遍,因此需要重新计算。

算参数的部分本质上是做一遍高维差分。

套上 Pollard-Rho 就做完了,这个板子考察得毫无意义。

「SDOI2018」旧试题

看见数据范围是 \(10^5\) ,心情舒畅了许多。

题目让我们求这样一个式子:

\[\sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \\ \]

是三元结构,如果是二元结构就是经典题。二元结构时,路径就是枚举最大公约数,然后由积性将式子拆开。

不妨按照这个思路进行尝试,先把 \(k\) 分出去,反演一下。

\[\sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \\ \sum_{p=1}^A \sum_{i=1}^{\frac{A}{p}} \sum_{q=1}^B \sum_{j=1}^{\frac{B}{q}} d(p^2q^2ij)\sum_{k=1}^\frac{C\gcd(p,q)}{pq} [\gcd(k , ij) = 1] d(k) \\ \sum_{p=1}^A \sum_{q=1}^B \sum_{T_a=1} \sum_{T_b=1} \mu(T_a) \mu(T_b) \sum_{i=1}^{\frac{A}{T_a p}} \sum_{j=1}^{\frac{B}{T_bq}} d(p^2q^2T_aT_bij)\sum_{k=1}^\frac{C\gcd(p,q)}{T_aT_bpq} d(T_aT_bk) \\ \]

式子太过丑陋,考虑改变枚举方式。

\[\sum_{T_a=1}^A \sum_{p|T_a} \sum_{T_b=1}^B \sum_{q | T_b} \sum_{i=1}^{\frac{A}{T_a}} \sum_{j=1}^{\frac{B}{T_b}} \mu(\frac{T_a}{p}) \mu(\frac{T_b}{q}) d(T_aT_bpqij) \sum_{k=1}^{\frac{C \gcd(p,q)}{T_aT_b}} d(\frac{T_a}{p}\frac{T_b}{q}k) \]


第一步方向就错了,我麻了。

\[\sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \\ \sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C \sum_{x|i} \sum_{y|j} \sum_{z|k} [\gcd(x,y) = 1][\gcd(x,z)=1][\gcd(y , z) = 1] \\ \sum_{x=1}^A \sum_{y=1}^B \sum_{z=1}^C [\gcd(x,y) = 1][\gcd(x,z)=1][\gcd(y , z) = 1] \lfloor \frac{A}{x} \rfloor \lfloor \frac{B}{y} \rfloor \lfloor \frac{C}{z} \rfloor \\ \sum_{x=1} \mu(x)\sum_{y=1} \mu(y) \sum_{z=1} \mu(z) \sum_{\operatorname{lcm}(x,y) | p} \lfloor \frac{A}{p} \rfloor \sum_{\operatorname{lcm}(x,z) | q} \lfloor \frac{B}{q} \rfloor \sum_{\operatorname{lcm}(y,z) | w} \lfloor \frac{C}{w} \rfloor \]

听说可以连边然后三元环计数。学了一下三元环计数,发现是一个很精巧很有意思的算法!

但有常规做法,我们再回溯回来看看。

\[\sum_{x=1}^A \sum_{y=1}^B \sum_{z=1}^C [\gcd(x,y) = 1][\gcd(x,z)=1][\gcd(y , z) = 1] \lfloor \frac{A}{x} \rfloor \lfloor \frac{B}{y} \rfloor \lfloor \frac{C}{z} \rfloor \\ \]

可以挑一个出来反演!

\[\sum_{d=1}^{\min(A,B)} \mu(d) \sum_{d | x}^A \sum_{d | y}^{B} \sum_{z=1}^C [\gcd(x,z)=1][\gcd(y,z) = 1] \lfloor \frac{A}{x} \rfloor \lfloor \frac{B}{y} \rfloor \lfloor \frac{C}{z} \rfloor \\ \sum_{z=1}^C \lfloor \frac{C}{z} \rfloor \sum_{d=1}^{\min(A,B)} \mu(d) \sum_{d|x}^A [\gcd(x , z) =1] \lfloor \frac{A}{x} \rfloor \sum_{d|y}^B [\gcd(y , z) = 1] \lfloor \frac{B}{y} \rfloor \\ \sum_{z=1}^C \lfloor \frac{C}{z} \rfloor \sum_{d=1}^{\min(A,B)} \mu(d) [\gcd(d , z) = 1] \sum_{x=1}^{\frac{A}{d}} [\gcd(x , z) =1] \lfloor \frac{A}{dx} \rfloor \sum_{y=1}^{\frac{B}{d}} [\gcd(y , z) = 1] \lfloor \frac{B}{dy} \rfloor \\ \sum_{z=1}^C \lfloor \frac{C}{z} \rfloor \sum_{d=1}^{\min(A,B)} \mu(d) [\gcd(d , z) = 1] f(\lfloor \frac{A}{d} \rfloor , z) f(\lfloor \frac{B}{d} \rfloor , z) \]

然后考虑对那一坨东西进行整除分块快速算。

容易得到递推式:

\[f(n , z) = f(n , z / p) - [p \not | \ z /p] f(\lfloor \frac{n}{p} \rfloor , z / p) \\ g(n , z) = \sum_{d=1}^n \mu(d) [\gcd(d , z) = 1] \\ = g(n , z /p) + [p \not | \ z /p] g(\lfloor \frac{n}{p} \rfloor , z) \]

然后就可以递推力。

「BZOJ3457」Ring

不如直接套用 polya 定理。

对于长度小于 \(k\) 的段,我们可以通过寻找指定字串的周期来计算。

否则,我们则需要找到长度为 \(L\) 的包含该字串的不可旋转环的个数。

不如使用矩阵乘法。构造一个大小为 \(2k \times 2k\) 的矩阵。

CF1824D LuoTianyi and the Function

先维护一个 nxt 数组,那么 \(g(l,r)\) 的值就是 \([l,r]\) 内的最小的 \(i\) 使得\(nxt_i > r\)

那么就有如果 \(nxt_x > nxt_y\)\(x < y\) ,则 \(y\) 是没有价值的。

从右往左扫,维护单调栈。

在线段树上维护一次函数计算即可。

CF1728F Fishermen

思路就是给每一个 \(a_i\) 定两两不同的生成值,然后从小到大排序就是我们的 \(b\)

于是,我们可以得到边数为 \(O(n^2)\) 的费用流做法。

显然是跑不过去的,但这启示我们考虑模拟费用流。

什么勾八垃圾题。直接带着那个 \(O(n^2)\) 建边跑匈牙利,从小到大一次枚举权值的点去匹配。

复杂度就是 \(O(n^3)\)

CF1305H Kuroni the Private Tutor

限制这么多,怎么看怎么网络流。

毫无头绪,麻了。

不急,一步一步来。假定我知道了每个学生的分数,我尝试检查是否可行。


不行了,看题解。

好题。

考虑网络流建图判断解的可行性。

\(a_i\) 表示每道题的通过人数,\(b_i\) 表示每个人的分数。默认从小到大排序。

要想合法,要求最大流等于 \(t\) 。不妨使用最小割来分析。

假设左部切了 \(c\) 条,右部切了 \(d\) 条,则中间至少切 \((n-c)(m-d)\) 条。

于是对于每一个 \((c,d)\) 都有:\((n-c)(m - d) + \sum\limits_{i=1}^c a_i + \sum\limits_{i=1}^d b_i \geq t\)

注意观察,如果存在 \(i,j\) 满足 \(a_i - a_j > 1\)\(a_i > l_i\)\(a_j < r_j\),可以进行调整:\(a_i \leftarrow a_i - 1\)\(a_j \leftarrow a_j + 1\)。容易发现,这样可以使得结果不劣。

于是,我们尝试通过 \(l,r,t\) 来确定 \(a\)

不妨找到一个中间点 \(p\) ,令所有 \(a_i\) 都满足:

  • 如果 \(p < l_i\) ,则 \(a_i = l_i\)
  • 如果 \(p \geq r_i\),则 \(a_i = r_i\)
  • 如果 \(p \in [l_i , r_i)\),则 \(a_i \in [p , p + 1]\)

每个 \(a_i\) 具体多少不重要,只有每个数目的有多少个是重要的。

发现随着 \(p\) 的改变,总和是单调变化的,因此 \(a_i\) 可以以此确定。

然后变化限制,得到:

\[\sum\limits_{i=1}^d b_i \geq t - (n - c)(m - d) - \sum\limits_{i=1}^c a_i \]

容易知道这是 \(n\) 个一次函数上取最严的限制,用李超树,我们可以得到:\(\sum\limits_{i=1}^d b_i \geq lim_d\)

显然,\(lim_m = t\)

现在第一问,要求我们最大化 \(b_i = b_m\) 的情况。

不妨二分答案,检查最大值个数是否有可能大于等于 \(x\)

那么就是说至少可以保证 \(\forall i \in [m - x +1 , m]\) \(b_i = b_m\)

先让每个学生的分数达到比他小的第一个额外信息。然后尝试使用剩下的分数去增加一些学生的分数。

为了满足我们的 \(lim\) 限制,我们肯定优先给排名靠后的增加,直到增加到不能增加为止(达到前一个额外信息了)。

如果相同长度包含限制,则带着限制进去算。

否则检查一下这个最大值的最小值时,能否合法,因为最大值越小越容易满足后缀和的限制。

依托答辩。

[十二省联考 2019] 希望

考虑 \(k = 1\) 的情况。即计算有多少个集合,使得集合里存在一个点到其他点的距离不超过 \(L\)

合法就是说,任意两个点之间的距离不超过 \(2L\)。长剖计算就是。

然后对于 \(k > 1\) ,可以容斥计算。多个联通块之间公有的可到达点一定还是联通块,我们考虑只在最顶上的点记录这个方案。

定义 \(f_{u,i}\) 表示子树内最长不超过 \(i\) 的连通块个数。

\(g_{u,i}\) 表示子树外最长不超过 \(i\) 的连通块个数。

答案为 \(\sum (f_{u,L} \times g_{u,L})^k - (f_{u,L-1} \times (g_{u,L} - 1))^k\)

计算 \(f\) 考虑长链剖分,然后给整个长链维护乘法和加法标记!

就可以直接转移力!

然后,同理,考虑换根 dp 计算我们的 \(g\)

很难写,要写个什么内存池做长剖的换根 dp。贺了一份。

[IOI2007] training 训练路径

就是说,我们需要计算通过删除一些非树边,使得整个图变成点无偶环仙人掌的最小花费。

考虑那些非树边,如果一条单边与树边构成了一个偶环,直接删掉。

否则,因为结果图是一个仙人掌,所以每个边只能被覆盖一次。

每个点的度数很小,考虑状态压缩。直接暴力随便转移即可。

[BJOI2018]染色

四元环应该是可行的捏。反正,不是二分图一定飞了。

是二分图有可能飞了。好难啊。

基于二分图进行分析。首先跑一个拓扑排序,度数为 \(1\) 的点就可以丢掉了。

然后如果有一个子图是 \(3 \times 3\) 的完全二分图就飞了。

一个普通的偶环我想也是可染色的。因为假设不可,那一定是一环一环限制死了。如果正反都能限制,那由于是偶环,所以一定限制不到同色。否则一定有一个中转,有一个中转我们只需要换一下开头,中转就会失败,那么就不会限制死。

但是由此看见,偶环是脆弱的。因为我们只需要通过别的情况固定一个位置,那么整个偶环就会被迫升天。

比如说两个偶环共有一个点是不是就飞了捏?是的!两个偶环只有一个公共点就会飞!

但是,如果有着不止一个公共点呢?情况似乎有些许不同。

有两个公共点也是不可以的。因为两个公共点可以放相同的集合。两个环分别针对不同的选择设计中转点。

实际上,两个相交的环,如果不相交的部分不均大于 \(1\) ,则必然可以不能染色!

那么不相交的偶环呢?如果是联通则也是不合法的。因为每个偶环可以限制死一个位置,就让他们相连的位置被限制死即可。

就是合法的情况,实际上从整体上来看就是一坨。


相交的环的结论可以描述为另一个更强大的形式!

除去度数为 \(1\) 的点过后有大于两个度数 \(\geq 3\) 的点,一定无解。

  • 如果这两个点不能形成环,那么一定有路径,因为联通。

    此外,这两个点至少还有两个度数,一定可以形成至少一个环,这两个环不会形成不合法情况,当且仅当他们交在路径上,则此时还剩一个度数,还能形成一个环,这两个环能形成不合法情况。

  • 如果这两个点能形成环,则还剩一点度数,一点还能形成环。如果与大环非交点部分均为 \(1\) 则又形成两个小环,合法当且仅当这两个点度数恰为 \(3\) 且共同连接着两个度数为 \(1\) 的点。否则必定不合法。

此外,不会只有一个度数 \(\geq 3\) 且该点度数为 \(3\) 的情况。

还有一个结论就是:

如果存在度数 \(\geq 4\) 的点则一定无解。

感性上很好理解。

如果走出去,没有走回来,则远端会形成一个 \(\geq 3\) 的点,则不合法。

所以走出去一定会走回来的。如果走的是一样的路回来,又会形成 \(\geq 3\) 的点,则不合法。

如果走不同的路回来,则会形成两个环,那么这两个环交点集合大小为 \(1\)。所以非交点部分大小一定不为 \(1\)。证毕。

[AH2017/HNOI2017]队长快跑

每一次,我都朝着喷射口移动一定最优。复杂度 \(O(n^3)\)

但我不行了。


我去,对于每条射线,我们可以把它转换成向上或者向下的射线,是等价的。

扫一遍可以得到可以连边的极角范围。那么复杂度就变成了 \(O(n^2)\) 的。

然后我们对于向上向下的喷射器去维护凸包。试图去计算每个点在最优情况下的前驱。

在加入一个点的时候,起点会被异侧的凸包点挡住,那么说明与其走上面的凸包,不如走下面的更优。

所以把同侧凸包清空。在异侧找到能够直接到达该点的点,作为两侧凸包的新起点。

然后就做完了。正确性略带感性。

CF1408I Bitwise Magic

考虑算一个高维后缀和。然后反解出来。

先转化为方案数。诶?\(k\) 很小!那么直观上感受,\(k\) 能够影响的位是不多的。

其实就是最低的四位和除去该四位的 lowbit 可能会受到影响。一定不变的位先整理起来。

反正有一个复杂度为 \(2^c n\) 的暴力 dp

我们先只状压较低的四位 dp。按除去低四位后的 lowbit 分类,然后就是跑一个 FWT 就好了。

复杂度是 \(O(k^3 (n + 2^c))\)

Gym104160B Binary Substrings

要求最大化由 0/1 组成的串的字串种类数。

CF1824E LuoTianyi and Cartridge

不妨枚举 \(\min (A , C)\) 的结果。那么现在使用可用点和边尝试最大化 \((B+D)\)

假设选择的点集确定了。如何确定边集?若一条边两侧都有选中的点那么一定合法,否则一定不合法。

然后考虑整理我们的图。不合法的边直接缩起来,点也一起缩起来。如果一个叶子里面不包含任意一个合法点就直接删掉。

所以叶子就有至少一个点被选中。因为选择了该叶子,就至少能够多选一些边。然后仔细观察就知道选的边数实际上是可以算的。实际上就是 \(e = \min(|V| - 1 , |E|)\)

那么决策就是,先把每个叶子的最大权值点选了,剩下的从大到小选。

边就是一直选最大的合法边就好了。

决策确立,我们现在就只用动态维护这个图就好了。

感觉删会比加要容易。然后为了维护这个点是不是叶子,还要拉个 set 做启发式合并,维护点里面包含哪些边。维护邻边。

「20230513 模拟赛」糖果

这是 OI 题?

分析答案下界。我们对某两个人进行过操作,就连一条边。至多有一个联通块大小为 \(1\)。从而其余联通块大小至少为 \(3\)。那么答案至少是 \(\lfloor \frac{2n}{3} \rfloor\)

对于一个大小为 \(3\) 的连通块,\(x,y,z\) ,进行两次操作可以将他们全部变成 \(x-y+z\)

于是我们尝试将其划分为 \(\frac{n}{3}\) 个三元组。使得每组的 \(x-y+z\) 相同。

\(n = 12k + r\)

然后是一些讨论和构造工作。

人类想的出来?人类想的出来?人类想的出来?

「20230513 模拟赛」刺杀

\(B,2B,\dots,\lfloor \frac{n}{B} \rfloor B\) 设为关键点。

  • 跨过某个关键点的询问:

    对于关键点 \(p\) ,虚树边就是 \(p\) 到区间所有点的路径上的边的并。我们记录 \(L_e\) 表示 \(p\) 左边离 \(p\) 最近的 \(L_e \rightarrow p\) 的路径上含有 \(e\) 的位置。\(R_e\) 定义类似。

    这两个东西是易于求解的,直接 dfs 扫一遍就好。

    如果 \(m=1\) 的时候,对边的编号做扫描线,然后维护一个 \(O(1)\) 修改,\(O(\sqrt{n})\) 查询的数据结构,去维护加入一个区间,和当前区间被哪些区间包含。

    对于 \(m>1\) 的情况,

  • 对于不跨过关键点的询问:

    其长度肯定很短。对于每个段,我们把他的虚树建出来,预处理每条边在虚树的哪条边上。然后询问的时候扫一下 \([x,x+l-1]\) 算一下哪些虚树边被覆盖了。然后再扫一遍 \([y,y+l-1]\) 算一下答案即可。

「2020 集训队论文」图上的游戏

考虑模拟 bfs 过程。每次把一个点所有的邻接边跑完。复杂度 \(O(m^2 n)\)。可以拿到 \(16pts\)

如果是一棵树,怎么做?我可以通过 \(O(m)\) 次操作,找到这个点到根的所有边。

如果是一条链,我们该如何找到这条链。可以随机删去一条边,这个链就被切成两段。找到两段的点集,和边集,然后分治,期望询问次数是 \(O(n \log n)\) 的。

然后处理树的情况。那么尝试去做一个链剖分。对于每一个点可以在剩余边中二分找到哪些边在它到根的路径上。然后二分它所在链,或者他所在链的父亲是谁。然后套用链部分的结果。最后对于每个链再二分一下其真实父亲是哪位。

然后是一般图。思路是先求出一棵生成树。如果找到了,非树边也可以二分求得。

找生成树也是直接二分就可以了。

「RHOI」Round 1 夕阳西下几时回

\(i , 2i\) 构造即可。

「RHOI」Round 1 无可奈何花落去

枚举天数,考虑树形 dp 计算花瓣度数的分配方案。

定义 \(f_{u,i,0/1/2/3}\) 表示 \(u\) 子树下面,保留 \(i\) 条边,下面没有合法的,且 \(u\) 的度数为 \(0/1/2\) ,以及下面有合法的方案数。

「RHOI」Round 1 似曾相识燕归来

如果 \(1\) 到最前面去了,那问题迎刃而解。

\(1\) 如果在最后一个位置那就是 \(-1\)

如果 \(1\) 右边有 \(< p_1\) 的数,那直接把 \(1\) 换过去。

否则,如果 \(1\) 没有占别人的位置,可以将 \(p_1\) 归位。然后继续检查。

否则,\(1\) 占有了别人的位置。那从前面换个小的到后面去,然后再交换一下,两步归位两个,不亏。

如果前面没有小的给它换了,也就是说两个数夹着的都归位了。那我们就要尝试,三步归位两个数,因为右边形成了一个环,会减少一次操作。

「BJOI2017」魔法咒语

什么简单题,\(L \leq 100\) 暴力 dp ,否则矩阵乘法冲冲冲。

「清华集训 2017」我的生命已如风中残烛

先给每个点按照其他点按极角排序。然后维护从某个点过来,权值在某个区间的下一个点是什么。

这个的状态数是 \(O(n^3)\) 的。然后每次询问,先找到一个环,然后一直走环,直到长度小于了环为止。

那么,我们花费 \(O(n)\) 的时间,让绳子的长度降低了至少一段,最多会降低 \(n^2\) 段,那么复杂度是 \(O(n^3m)\)

但是,可能的被阻拦情况只有 \(O(n^2)\) 种,所以我们只要能够判断循环节则是 \(O(mn^2)\) 的复杂度。

绳子长度显然是不断减少的,所以我们在每个点的位置维护一个指针,省去二分步骤。

我是哈卵,最多有 \(\log L\) 个循环节,因为每次找到会让 \(L\) 小于 \(\frac{L}{2}\),每个循环节找到需要 \(O(n)\) 复杂度。

然后还有每次维护的指针。总复杂度大体是 \(O(T(mn^2+mn\log L))\)

「2018 集训队互测 」完美的旅行

一个想法是,继续算按位与至少为 \(y\) 的值。那等于说是将限制起终点对变成了分别限制起终点集合。

然后我需要对每一个 \(x,y\) 算出一个结果,最后再把他们卷起来之类的。

定义 \(f_{i,j}\) 表示走 \(i\) 步,终点在 \(j\) 的方案数。算一次的复杂度是,\(O(mn^2)\)

我们想对于每一个 \(y\) 都计算出这样一个东西,那就要 \(O(1)\) 计算每一个状态。

题解都是 BM ,有些破防,问了一下狗,他跟我说分块,然后枚举中间点转移,两侧独立,因此复杂度变成了 \(O(n^2m \log n)\)

然后建立生成函数 \(f_{i}(x)\) ,那么结果就是 \([x^k]1 + f_{i}(x) + f_i^2(x) + \dots = [x^k]\frac{1}{1 - f_{i}(x)}\)

多项式求逆再算一遍就好了。

posted @ 2023-05-15 20:10  Reanap  阅读(82)  评论(0编辑  收藏  举报