练习记录

CF1541B

\(a_ia_j=i+j\) 的对数,\(a_i\ne a_j,n\leq10^5\)

排序后枚举,由于 \(a_ia_j\) 会很大但是 \(i+j\) 会很小,所以枚举的效率是高的。

CF1541C

已知单源最短路径长,求边权和的最小值。

尽量少安排正权边,多安排负权边,且要满足三角形不等式。

\(d(v)+cost(u,v)\ge d(u)\)

要让 \(cost(u,v)\) 尽量小,显然要取等号。

因此,从小到大排序,正权边连成一条链,每个点 \(i\) 都往前面的点 \(j\) 连一条 \(d(j)-d(i)\) 的边。

这个东西用前缀和瞎算就 ok 了。

CF1541D

给一树,第一次随机取一个点。然后每次随机取与已取点相连的点。求取点的序列中逆序对个数期望。\(n\leq 200\)

  • 枚举根 \(r\)
  • 枚举所有点对 \((u,v)\)。假设 \(u\) 比较大。如果 \(u\)\(v\) 之前加入数组,就会对逆序对数有贡献。 \(u\) 被加入时是从 \(r\)\(lca\)\(u\)\(v\) 被加入时是从 \(r\)\(lca\)\(v\)。因此只有 \(lca\)\(u,v\) 的路径是不同的。你可以向 \(u\) 走一格,也可以向 \(v\)。相当于从 \((lca,lca)\) 走到 \((u,v-1)\) 的概率。简单 dp 可以求出。

这样做复杂度为 \(O(N^3\log N)\) 的,但是我们可以枚举 \(LCA\),把算 \(LCA\)\(\log\) 压掉。

AGC063B

定义一个空数列是好的,在一个好的数列的任意位置插入 \(1,2,3,\cdots,k\) 也是好的,给定数列 \(a_1,a_2,\cdots,a_n(n\leq5\times10^5)\),求有多少连续子序列是好的。

定义 \(p_i\) 是使得 \([p_i,i]\) 好的最大的位置,用栈维护 \(p_i\),具体而言,从头到尾扫一遍,假设目前是 \(a_i=k\)\(k=1\) 就加入栈,否则就找到栈里面最顶部的 \(a_x=k-1\),如果有,\(p_i\)就是\(p_x\)的位置,把\(i\)加入栈,否则\(p_i=0\)

然后 DP,定义 \(f_i\) 表示以 \(i\) 结尾的好序列个数, \(f_i=f_{p_i-1}+1\),加起来就是答案。

AGC064B

给定一个图 \(G\),每条边有黑白两种颜色,每个点有黑白两种颜色,求构造一个 \(G\) 的生成树,使得对于每一个点存在与其相连且与其颜色相同的边。\(n,m\leq2\times10^5\)

定义若边 \((u,v,col)\) 满足 \(u,v\) 的颜色都是 \(col\) ,则是好边。

首先生成树上至少存在一条好边。考虑反证法,若不存在,\(n-1\) 条边至多可以满足 \(n-1\) 个点的要求,显然矛盾。于是可以在不成环的前提下贪心地选择所有好边,考虑 Prim 的过程,接下来添加使得能够使得连通块总点数扩大的边,最后添加无关边,把所有连通块连起来。

AGC064C

Takahashi 和 Aoki 进行一个博弈游戏,T 先手,黑板上有 \(n\) 个区间 \([l_i,r_i]\) 的所有整数,他们轮流选择删掉黑板上所有的奇数或者偶数,每次操作后,黑板上所有数变成原来的一半(下取整),无法操作者败。求该游戏对谁是必胜的 \((n\leq10^4,l_i\leq r_i\leq10^{18})\)

不会

ABC312E

给定 \(n\) 个长方体,它们两两不交,输出与每个长方体接触的长方体个数(若两个长方体表面的交的面积存在,则称为接触)。\(n\leq10^5,x_i,y_i,z_i\leq 100\)

先考虑上下接触的部分,直接暴力维护空间内的小正方形 \((x_i,y_i,z_i),(x_1+1,y_i+1,z_i)\) 是哪个长方体的下面,由于下面只能与上面接触,再对每个长方体的上面扫描一遍,查看是另一个长方体的下面。然后用 setvector 统计,然后把上下改为前后、左右,算三遍。

一定小于 \(6M^3\) 个面,可以通过。

CF1858D

给一个01串,你至多反转 \(k\) 位,设极长0串和1串的长度为\(p\)\(q\),对于 \(i=1,2,\cdots,n\) 输出 \(ip+q\) 的最大值。\((n\leq 3000)\)

固定0串的左端点 \(l\),设 \(g_m\) 表示翻转 \(m\) 位最长1串的长度,枚举右端点 \(r\),在 \(g\) 中二分出 \(k - cost(l,r)\),当左端点移动时,更新一遍 \(g_m\)。跑一遍后把原数列翻转,再跑一遍,处理0串在1串左边的情况。然后对于每个 \(p\) 存最大的 \(q\),统计的时候扫一遍就行了。

实现的时候需要注意的是,对于某些 \(p\) 是不可行的,不要把 \(q\) 定义为 \(0\)

code

CF1863E

给定 \(n\) 个任务和 \(m\) 个依赖关系,每个任务必须在一天的 \(a_i\) 点前完成,其中一天一共有 \(0\sim k-1\),共 \(k\) 小时。做任务的时间忽略不计,求完成所有任务的最短时间。

定义边权 \(w_{(u,v)}\) 表示做完 \(u\) 之后需要等待到做 \(v\) 的时间。对图拓扑排序,求 DAG 最长路。但是这个最长路的最大值不一定是答案,因为对于每一个路径 \(x\rightarrow y\) 而言(\(x\) 是使得 \(x\rightarrow y\) 最大的 \(x\)),限定了当且仅当开始时间恰好为 \(a_x\) ,所花时间才是最长路的长度,但是 \(x\) 未必唯一,故需要找到究竟选哪一个 \(a_x\) 总时间最短。每一个路径 \(x\rightarrow y\) 可以视为一个区间 \([a_x, a_x + dis(x,y)]\),从小到大枚举左端点,用 multiset 维护右端点最大值,枚举完一个区间之后,把其右端点 \(+k\) 之后丢到 multiset 里面。(实际上维护一个变量就可以做到了,没有删除操作)。

因为有对区间左端点的排序,时间复杂度还是 \(O(n\log n )\)

code

Ucup S2E1B

给一个带边权的有根树,根为编号为一的红点,给定红点集 \(S\)\(q\) 次询问,每次给定一个点集 \(T\),你可以添加一个红点,使得 \(\max_\limits{u\in T}\min\limits_{v\in S, u\in \operatorname{subtree}(v)}\operatorname{dis}(u,v)\) 最小,多测。

\(2\leq |S|\leq n\leq10^5, 1\leq q\leq2\times10^5,\sum |T|\leq2\times10^6,\sum n\leq10^6\)

首先,对于每一条边 \((u,fa_u)\)\(fa_u\) 是红点,可以等价为 \((u,1)\),若 \(u\) 是红点,可以等价于这条边不存在。所以可以等价于只有根节点是红点的情况。

接下来可以在虚数上跑类似换根 DP 的东西。更方便的做法是将 \(T\) 的点集按深度从大到小排序:\(u_1,u_2,\cdots,u_k\)。为了使得最大值最小,添加的点一定会更新 \(u_1,\cdots,u_i\),选它们的 LCA 最优。然后算一下就行。更进一步,发现改变树结构的操作也是多余的。我是消愁

CF1872G

给定一个序列 \(a_i(a_i\geq 1)\) ,求使得 \(\left(\prod\limits_{i\in[l,r]}a_i\right)-\left(\sum\limits_{i\in[l,r]}a_i\right)\) 最大的 \(l,r\)

显然,通常来说,选择第一个非 1 的位置和最后一个非 1 的位置比较优。但是在特殊情况下不是这样。假设 \([l,r]\) 最优, 若 $\prod\limits_{i\in[l,r]}a_i\geq 10 ^ 9 $, 那么 \(l,r\) 一定是非 1 数字的最小和最大的位置,否则拓展一个数的贡献一定远远大于消耗。

于是, 如果 \(\prod a_i\leq 10^9\) 就暴力, 否则就直接输出。暴力操作的话,至多有 \(\log 10^9\) 个数,不超过 \(30\),可以通过。

CF1861E

定义一个长度为 \(n\), 值域为 \(\{1,2,\cdots,k\}\) 的数列的价值为相互不交的连续子序列个数的最大值,且每个连续子序列都是 \(1\sim k\) 的一个排列。求所有数列的价值之和。\(2\leq k \leq n \leq 4\times 10^3\)

考虑 DP,若 \(n = m\) 时,且第 \(m\) 位是一个排列的结尾,这样的数列数量为 \(f_m\),考虑间隔 \(r\) 位才产生一个新的排列。则可以列出转移:\(W(r+k)\cdot f_{m}\rightarrow f_{m+r+k}\) 其中 \(W(x)\) 表示恰好生成第 \(x\) 个数时,最后 \(k\) 位凑齐排列的数量。

\[\cdots [a_{m+1},a_{m + 2},\cdots,a_{m + k}],\underbrace{a_{m +k+1},a_{m+k+2},\cdots,a_{m+k+r},[a_{m+k+r+1},\cdots,a_{m+2k+r}]}_{W(k+r)},\cdots \]

定义 \(g(n,m)\) 表示前 \(n\) 位,后 \(m\) 位成功 match 的方案数目,则 \(g(n,m) = g(n-1,m-1)\cdot (k-m+1) + \sum\limits _{m\leq p <k}g(n-1,p)\)\(g(0,0)=1\), \(W(x) = g(x,k)\),答案即 \(\sum\limits_{1\leq i\leq n}f_i\cdot k^{n-i}\) 递推前缀和算算就行。

[ICPC2020 Nanjing R] Just Another Game of Stones

给定 \(n\) 个数,\(q\) 次操作,分为两种

  • 对于区间 \([l,r]\) 赋值: \(\max(a_i,c)\rightarrow a_i\)

  • 给定一个区间 \([l,r]\) 与整数 \(x\) ,对于区间和 \(x\)\(r-l+2\) 个数,做一遍 Nim 游戏,若使得先手必胜,他第一步有多少选择

其中,Nim 游戏是无法取石头的人输,\(n,q\leq 2 \times10^5\)\(0\leq a_i\leq2^{30}-1\)

根据结论,这个 Nim 游戏,第一个人只要拿 \(\operatorname{xor}a_i\) 个,使得第二个人的局面一直是异或和为 \(0\) 就行了。

对于操作 \(2\) 只要维护异或和,若为 \(0\) 直接输出 \(0\),设异或和为 \(s\),否则就是要找到满足 \(s\operatorname{xor} p<p\)\(p\)

可以把二进制拆开考虑,就是 \(s\) 最高位 \(p\) 也为 \(1\) 就行。于是用吉老师线段树(维护 最小值,最小值数量,次小值)维护异或和和每一位的个数就可以。复杂度是 ploy log 的。值得注意的是, inf 要设为 \(2\times 10^9\)

ICPC Qingdao G

给定一个数列,每次ban一个位置,在每次ban之前,求连续子序列逆序对数的最大值,强制在线。(6s)\(n\leq10^5, \sum n \leq10^6\)

先考虑用权值线段树来维护区间逆序对数,不难支持在原数列前后加或删除一个数。然后考虑原题的分裂过程,将一段 \([l,r]\) 分裂成 \([l,p-1]\)\([p+1,r]\) 两个区间,对于小的区间,直接暴力建一个新的线段树;对于大的区间,直接在 \([l,r]\) 的树上暴力减。

时间复杂度是 \(T(n) = 2T(\frac n2)+O(n\log n) = O(n\log ^2 n)\)

CF1870 D

\(k\) 元,你可以花费 \(c_i\)\([1,i]\) 加一,操作后字典序最大可以是多少。

用单调栈维护递增的位置,把所有钱买第一个位置,剩下的钱尽可能升级成第二个位置,以此类推。

ICPC 2023 Online 1 K

给定一个 \(n\) 个点的凸包,\(q\) 次询问,每次给定一个圆,求在凸包内选择一个点 \(M\),在圆内随机取一个点 \(P\),求 \(E(|MP|^2)\) 的最小值 \(n,q\leq5000\)

实际上影响答案的因素只有圆的半径 \(r\)\(M\) 到圆心的距离 \(d\),不妨设圆的方程为 \(C:x^2+y^2=R^2\)\(M\) 的坐标为 \((-d,0)\)

\(P(r\cos\theta,r\sin\theta)\),故

\[\begin{align*} E &= \iint\limits_{0\leq r\leq R,0\leq\theta\leq2\pi}\left[(r\cos\theta+d)^2+(r\sin \theta)^2\right]\frac{r}{\pi R^2}\mathrm{d}r \mathrm{d}\theta\\ &= \dfrac{1}{\pi R^2}\iint\limits_{0\leq r\leq R,0\leq\theta\leq2\pi}r^3+d^2r+2dr^2\cos\theta\mathrm dr\mathrm d\theta \\ &= \dfrac{1}{\pi R^2}\int\limits_{0}^{R}\mathrm dr\int\limits_{0}^{2\pi}\left(r^3+d^2r+2dr^2\cos\theta\right)\mathrm d\theta\\ &= \frac{2}{R^2}\int\limits_{0}^Rr^3+d^2r\mathrm dr\\ &=\frac{R^2}{2}+d^2 \end{align*} \]

(大概吧,还没学积分)

然后就准备维护点到凸包的距离,这个可以暴力算点到凸包上每个 线段 的距离,并且需要用叉乘判断一下点是否在凸包内。

ICPC 2023 Online 1 J

给两个圆,满足两个圆上任取一点,它们的横纵坐标不相同,两个圆内分别取一点 \(P,Q\)(含边界),改变 \(Q\) 使得 \(PQ\) 的曼哈顿距离期望最大。

这个就 trival 了,\(P\) 可以等效为圆心。

image

\(M(DE)+M(DF)=2M(DJ)=2M(DA)\),显然。

于是 \(DA\) 的最短距离就是 \(M(CA) - \sqrt2 r_2\)

ICPC 2023 Online 1 G

给定一个树与 \(n-1\) 个操作,每次操作给定 \(u,v\),在目前 \(u\) 的连通块与 \(v\) 的连通块中随机选一个点连边,求最终形成给定的树的概率。

用并查集维护连通块的大小,为了维护合并时的树结构, find(u) 需要定义为该连通块中深度最小的点,当两个连通块连接时,如果 find(u) 的父亲所在连通块恰好为 \(v\) 所在连通块(假设 \(u\) 的深度更深),说明有可能连到树边,概率为两个连通块大小的乘积的倒数,否则概率为 \(0\)

2023 ICPC Online 2 I

你需要从 \(0\) 走到 \(n\),当你在 \(i(0\leq i < n)\) 时,在你可以花 \(1\) 秒:①增加一,②roll一个骰子,有 \(p_i\) 的概率变成 \(n\),有 \(1-p_i\) 的概率变成 \(a_i(0\leq a_i\leq i)\)。求最优策略下走到 \(n\) 的期望时间 \(E\)

显然,只选择①的情况可以在 \(n\) 秒内,考虑最优策略,一定是锚定一个位置选②,因为最优策略只跟与终点的距离有关,与当前的时间无关。假设锚定 \(i\),如果失败,会浪费 \(W=i-a_i+1\) 秒回到原来的位置, \(E_i=(1-p_i)(E_i+W)+p_i\),化简得 \(E_i=1+\frac{W(1-p_i)}{p_i}\)

HDU Multi 2023 R4 G

\[f(n)=\exp \left(\sum_{d|n}\mu(\frac nd)\ln (d)\right) \]

其中 \(1\leq n \leq10^{18}\)

实际上 \(f(n) = \prod\limits_{d|n}d^{\mu(n/d)}\),考虑当 \(n=p^\alpha\) 时(\(p\) 是质数) \(f(n)=1^{\mu(p^\alpha)}\cdot p^{\mu(p^{\alpha-1})}\cdots \left (p^{\alpha-1}\right)^{\mu(p)}\cdot\left (p^{\alpha}\right)^{\mu(1)}=p^{1-\alpha}\cdot p^\alpha=p\)

再考虑任取 \(m\bot n\),若设 \(n,m>0\)

\[\begin{align*} f(mn) &= \prod_{d|mn}d^{\mu(mn/d)}\\ &=\prod_{d_1|m,d_2|n}(d_1d_2)^{\mu(m/d_1)\cdot\mu(n/d_2)}\\ &=\prod_{d_1|m,d_2|n}\left(d_1^{\mu(m/d_1)}\right)^{\mu(n/d_2)}\cdot\left(d_2^{\mu(n/d_2)}\right)^{\mu(m/d_1)}\\ &=f(m)^{\sum_{d|n}\mu(d)}\cdot f(n)^{\sum_{d|m}\mu(d)}\\ &=f(m)^{[n=1]}\cdot f(n)^{[m=1]}\\ &=1 \end{align*} \]

(倒数第二步用到了 $\mu*I=\varepsilon $)特殊的 \(f(1)=1\),于是我们知道,当 \(n\) 为质数 \(p\) 的幂次时,\(f(n)=p\),否则 \(f(n)=1\)

利用 miller_rabin 可做。

HDU Multi 2023 R4 D

给一个 \(0\sim n-1\) 的有序排列,\(m\) 次操作,每次操作找两个数交换位置,求不动点数的期望

由于期望的可加性,即 \(E=nP(a_0=0)\),令 \(f_k=P(a_0=0|m=k)\)

则有 \(f_k=f_{k-1}\cdot\frac{1+(n-1)^2}{n^2}+(1-f_{k-1})\cdot\frac{2}{n^2}=f_{k-1}\cdot\frac{n-2}{n}+\frac{2}{n^2}\),得到 \(f_k-\frac{1}n=\frac{n-2}n(f_{k-1}-\frac{1}n)\),故答案为 \(1+(n-1)(\frac{n-2}{n})^{m-1}\)

Ucup S2E4 E

已知有 \(p-2\) 个数的集合 \(S=\{1,2,\cdots,k-2,k-1,k+1,k+2,\cdots,p-2,p-1\}\),求其大小为 \(t\) 的子集元素积的和,模 \(p\),保证 \(p\) 是质数。

首先不考虑挖掉 \(k\) 的集合,由于 \(p\) 是质数,所以其原根存在。

由欧拉定理,\(p^c\)\(p^{c+\varphi(p)}\) 同余,可定义 \(p\) 的原根 \(q\) 是满足在模 \(p\) 意义下,\(q,q^2,q^3,\cdots\) 恰好有 \(\varphi(p)\) 个数的数。
正整数有原根的充要条件为:它能表示为下列形式之一: \(2,4,p^n,2p^n\),其中 \(p\) 为奇素数。

于是 \(\{1,2,\cdots,p-1\}=\{q,2q,\cdots,(p-1)q\}\) (考虑在 \(\times q\) 是一个长度为 \(\varphi (p)=p-1\) 的环)

于是可以一一映射,设 \(M\) 为答案,则有 \(M=q^tM\),因此答案为 \(0\)

在考虑把 \(k\) 去掉,设 \(f(p,k,t)\) 为答案,则根据上述分析,有 \(f(p,k,t)-kf(p,k,t-1)=0\),等比,答案为 \((-k)^p\)

LG1972

静态区间数颜色数,不强制在线。\((1\leq n,q\leq 10^6)\)

按照询问右端点从小到大排序,每个颜色只考虑最后一次的贡献,用树状数组维护。

SCCPC2021 F

给定一张无向图图 \(G\)\(n\) 个点 \(m\) 条边,求一组给边定向的方案,使得 \(\sum\limits_{u\in G}\max(0, d_u-a_u)\) 的值最小,其中 \(d_u\)\(u\) 的入度,\(a_u\) 是给定的数组。 \((2\leq n \leq 300, 1\leq m\leq 300)\)

拆边,对于第 \(i\) 条边 \((u,v)\),建一个二分图,左边放所有点,右边放所有边,然后连接 \(L_u,R_i\)\(L_v,R_i\),边权设为 \(1\),再设源点 \(S\) ,与左部所有点连起来,边权为 \(a_i\),再设一个汇点 \(T\),与所有右部点连起来,边权为 \(\infty\),最大流就表示最多能白嫖的数量,拿 \(m\) 减掉最大流就是答案。

CF1920B

定义两个长度相同的串 \(S,T\) 为一对“神奇串”当且仅当 \(S\) 重新排列后可以变成 \(T\)

对于一对“神奇串” \(S,T\) ,定义他们为一对“超级神奇串”当且仅当能对它们划分成 \(k(k>1)\)段,使得所有的切片都为一对“神奇串”。现在给你一个串 \(S\),每次询问一个子串,问是否至少存在一个串使得该串与子串是一对“神奇串”但不是“超级神奇串”。

实际上字符有 26 种,可以看作为 26 维向量。即求是否存在一种最短路径,与给定的路径不交。显然大于等于三维的情况一定正确,二维的话需要满足两端的字母相同。前缀和维护一下就可以了。

CF1110D

给定 \(n\) 张值域为 \([1,m]\) 的麻将,求最多能形成多少搭子。\((1\leq n,m\leq 10^6)\)

按值域考虑,考虑转移 \(i+1\) 时顺子的个数与 \(i,i-1\) 剩下的数量有关,定义 \(f(x,c_1,c_2)\) 表示用值域 \(x\) 以内的牌,且 \(x\) 剩下 \(c_1\) 张,\(x-1\) 剩下 \(c_2\) 张的情形下能够组成的最多搭子数。显然,同种的顺子最多考虑两次。

由于最坏情况下, \(c_1\) 会在 \(x-1,x,x+1\) 的顺子和 \(x,x+1,x+2\) 的顺子中用到,因此最多要留 \(4\) 个。转移的话,枚举顺子的数量,对于剩下来的 \(c_0\),要么尽可能多的做刻子,也可以把做出来的刻子拆掉一个。最后值得注意的是,若 \(f(x,c_1,c_2)\) 的状态不存在,需要设为 -inf。需要滚动数组。

code

posted @ 2021-07-02 00:39  haze1231  阅读(104)  评论(0)    收藏  举报