模拟赛

news/2024/9/24 16:44:39/文章来源:https://www.cnblogs.com/ZepX-D/p/18429532

P4562 :

求期望乘上方案数来求总的贡献

捆绑销售:


二分最大答案,发现是最大闭合子图,建网络流模型求解。

code

斐波那契数列 :

\(f_{i+1}\times f_{i-1}-f^2_{i} = (-1)^i\)

树相关


\([1,n]\) 中能不能被给出 \(k\) 个整数中任意一个整除考虑容斥,设 \(f_{i,j}\) 表示 \([1,i]\) 中至少被前 \(j\) 个数中的一个整除的数有多少个,则 \(f_{i,j} = f_{i,j-1}+\lfloor\frac{n}{a_i}\rfloor+f_{\lfloor\frac{n}{a_i}\rfloor,j-1}\) ,最后答案为 \(n-f_{n,m}\)


二维问题考虑枚举定住其中一维,另一维快速统计 Link


有限制的字符串拼接问题可以考虑图论建模 Link


求出 \([l,r]\) 内能组成的周长最长的三角形周长,若三根无法组成三角形,设 \(x<y<z\) 则有 \(x+y < z\) ,容易发现是以对数速度下降的,线段树维护前 \(log\) 大。


\(\sum|S_i| = n\) ,铭记根号分治和分块


序列:


图论建模,tarjan 缩点。

code

树差:


与深度差相关的,拆式子拆成 \(dep_x-dep_y\)

code

IE2 - Journey :

k 个都出现考虑容斥。

凹包:


一个连通块内给边定向,使任意节点入度 \(\le 1\)

code

差异序列:


\(|A-B| = \max(A,B)-\min(A,B)\) ,则 \(\sum\limits_{i=1}^{n} = 2\times m-\sum_{i = 1}^{n}\min(A,B)\)

code

8.19 C:


+1 操作即将二进制最后连续 \(k\) 个 1 进位,即异或上 \(2^{(k+1)}-1\) ,容易发现只有 \(k\) 只有 \(log\) 种,先建好线性基,\(k\) 递减的同时把线性基对应的桶里面的数取模向后插入即可。

Bully Sort :

对于排列交换使之有序之类的,考虑最后 \(\sum\limits_{i=1}^{n}|i-p_i| = 0\) 以及 \(\sum_{i<j}[p_i>p_j] = 0\) 等最终状态。


前缀 \(or\)\(and\) 只会有 \(log\) 种取值 Link


Bridge Club:

首先可以根据 \(1\) 的数量分组,奇数分左边,偶数分右边,容易发现是个二分图,所以是一个二分图上费用流。

但是点数太多。

我们考虑一下最多有多少条边是有用的,对于一条边如果他被选了,那么他的两个端点 \(u,v\) 所连的所有边都不可能被选,所以选一条边的代价是 \(2n\) 条边。

那么我们要选 \(k\) 条边,所以有一个显然的贪心就是,我们先把边按权值排序,取前 \(2nk\) 条边然后连边,这样点数和边数都会很小。

8.22 A:

扣除某个数的背包

8.23 C:


对于一个 \(i\) 他只可能向左边的最大值或者右边的最小值连边,但是如果我们贪心的这样连不太行,因为可能会出现环。

我们发现出现环的情况只可能是两个极值相互连边,那我们可以按照最大值或者最小值把序列分开,对于每段可以贪心的连段尾或者前缀最小值或最大值,而对于段尾只能连之前段的最小值或最大值。

CF891D :

小清新换根 dp。

首先把 \(n\) 为奇数的情况特判掉,因为肯定无解。

再考虑 \(n\) 为偶数的情况,我们设 \(f_{i,0/1,0/1}\) 为考虑 \(i\) 的子树,\(i\) 有没有匹配,除去 \(i\)\(0/1\) 个失配的点的方案数。

考虑答案如何计算。

我们把两棵树接起来依旧有完美匹配只有两种情况:

  1. 原先两棵树分别可以形成完美匹配。
  2. 原先两棵树在根失配的情况下还可以形成完美匹配。

那我们有一个 \(O(n^2)\) 的做法是枚举哪条边被割掉,然后分别计算两棵树的 dp 值,那么答案为:

\[f_{u,0,0}\times(f_{v,0,0}+f_{v,1,1})+f_{u,1,0}\times f_{v,1,0}+f_{u,1,1}\times(f_{v,1,1}+f_{v,0,0}) \]

状态转移有:

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

现在我们考虑换根。

换根的过程相当于是我们枚举 \(u\) 删掉边 \(fa_u\to u\) 然后根据两边的 dp 值像上文一样计算答案。

接着考虑一下这个过程中我们需要维护哪些新的量,首先我们需要一个 \(h_{u,0/1,0/1}\) 表示 \(fa_u\) 除去 \(u\) 以后剩下点的 dp 值,对应的我们还需要一个 \(pre_{u,0/1,0/1}\)\(suf_{u,0/1,0/1}\) 表示 \(fa_u\) 的儿子中 \(u\) 的前缀 dp 值和后缀 dp 值。

容易发现 \(f_{u,0/1,0/1}\) 具有交换律和结合律,所以我们有 \(h_{u,0/1,0/1}\gets h_{fa_u,0/1,0/1}\times pre_{pre_u,0/1,0/1}\times suf_{nxt_u,0/1,0/1}\)

8.24 B:

  • 建图,对于逆序对 \(i< j, Ai > Aj\) 连边 \(i → j\),这样操作就变成了每次删除最多两个入度为 0 的点。

  • 首先,像一般的拓扑排序那样,每次删去一个入度为 0 的点并加到拓扑序中。
    如果有多个入度为 0 的点,设 \(N(v)\)\(v\) 的入边被删除的时间的集合。
    将每个 \(N(v)\) 中的元素降序排列后寻找字典序最小的 \(N(v)\),并在这一轮中选择 v。

  • 然后,逆着拓扑序反着求答案。每次取两个在拓扑序中最靠后的,出度为 0 的点删去,并加到答案的前端。

  • 考虑优化。首先,计算出 \(level(i)\) 表示以 \(i\) 结尾的最长路。也就是以 \(i\) 结尾的最长下降子序列长度。
    我们按照 \(level(i)\) 升序处理所有点,不难发现这样和上述做法是等价的,且同层间没有连边。
    那么,分层做,我们只需要支持对任意 \(v, w\) 比较 \(N(v), N(w)\) 的字典序即可。由于已经降序,所以我们事实上只需要比较 \(N(v)-N(w), N(w)-N(v)\) 中的最大值。
    这是单点修改,矩形 \(max\),用树套树即可做到单次 \(O(log^2n)\),总共 \(O(n log^3n)\)

code

8.26 B:

8.27 A:


这道题比较抽象。

\(f_{i,j,k}\) 表示使用第 \(i\) 到最大的质数,一共用了 \(k\) 个数和为 \(j\) 的方案数,设 \(g_{i,j,k}\) 表示这些方案数的纯数字长度。

然后暴搜剪枝即可。

P8043 [COCI2016-2017#7] KLAVIR:

答案是 \(m^n+\sum\limits_{p\in P} m^p\) 其中 \(P\) 为字符串的 \(border\) 集合,考场上对着大样例瞪出来的。

8.28 A:

分每一位来考虑,这种和为 n 的考虑根号分治,修改次数 \(\ge B\) 的下标暴力 \(dfs\) 一遍树,\(< B\) 的把修改塞到节点的 \(vector\) 里,搜到这个节点枚举修改操作,将对应的子树的贡献用树状数组维护,同时处理这个节点的查询。

code

8.30 A:

考虑 DP,设 \(dp[i][0/1]\) 表示 \([1,i]\) 正确划分的方案数,其中最后一段是否合法。

\(pre[i]=pre[i+1]+10^{n-i}\times s[i]\) ,那么区间 \([j,i]\) 合法当且仅当 \(\frac{pre[j]-pre[i+1]}{10^{n-i}}\equiv0\pmod D\)

\(\gcd(D,10) = 1\) 时,相当于是 \(pre[j] \equiv pre[i+1]\pmod D\),直接开个桶就好。

\(\gcd(D,10) \ne 1\) 时,设 \(D = 2^x5^yz\) ,那么相当于要求 \(\%2^x\%5^y\%z\) 同时为 \(0\) 。对于固定的 \(i\) ,在 \(j\le i-20\) 以后 \(s[j]\)
的贡献 \(\%2^x\%5^y\) 都是 了,只用考虑 \(\%z\) 的限制,此时同样可以对 \(\%z\) 开桶。对于 \(j>i-20\) 直接暴力即可。

code

8.30 C:


确定一条边的状态那么所有的状态就都确定了,跟之前一道题非常像。

那么就枚举哪条边不能通行,从删掉 \((i,i+1)\) 移动到删掉 (i+1,i+2) 产生的影响并不多,这个是均摊的,因为每一个 \((a_i,b_i)\) 只会改变一次,于是操作就变成了区间 +1 和撤销 ,查询 > 0 位置的权值和,我用分块维护的。

code

9.2 A:

给定长度为 \(n\) 的实数序列 \(x\)\(x_i\) 等概率从 \([l_i,r_i)\) 选取,求 \(\lfloor \sum_{i=1}^nx_i\rfloor^k\) 的期望值。
\(1\le n\le 10^3,1\le k\le 30\)

把整数和小数分开考虑,根据期望公式和二项式定理我们有:

\[\text{E}[(x+\lfloor y\rfloor)^k]=\sum_{i=0}^k\binom{k}{i}\text{E}(x^k)\text{E}(\lfloor y\rfloor^k) \]

其中 \(x\) 为整数,\(\lfloor y\rfloor\) 为小数部分的贡献。

然后我们就可以拆开分别计算了。

我们设 \(s_i\)\(\sum_{j=1}^i x_j\) 的小数部分,容易发现,\(\lfloor x_1+x_2+...+x_i\rfloor=\lfloor x_1+x_2+...+x_{i-1}\rfloor+1\)  当且仅当 \(s_i<;s_{i-1}\) 。我们不妨将 \(s_i\) 替换成 \(s_i\) 在整个数列中的排名,最后会的得到一个序列。显然所有 \(n!\) 种序列出现的概率都是相等的。

考虑dp,设 \(g_{i,j}\) 表示长度为 \(i\) 的序列有 \(j\) 个位置满足 \(s_{i}<;s_{i-1}\) 的方案数。我们从小到大往序列里插数。有四种情况:

1.插在开头,从 \(g_{i-1,j-1}\) 转移过来。

2.插在结尾,从 \(g_{i-1,j}\) 转移过来。

3.插在一个满足 \(s_i<;s_{i-1}\) 的位置中间,从 \(j\times g_{i-1,j}\) 转移过来。

4.插在一个满足 \(s_i>;s_{i-1}\) 的位置中间,从 \((i-j-1)\times g_{i-1,j-1}\) 转移过来。

所以我们得到方程:\(g_{i,j}=(j+1)\times g_{i-1,j}+(i-j)\times g_{i-1,j-1}\),可以 \(\Theta(n^2)\)求出。

我们在考虑整数位,我们设 \(f_{i,k}\) 为前 \(i\) 个数的 \(k\) 次方和的总和。

同样的,我们再使用二项式定理把它拆开,有:

\[\begin{aligned} f_{i,k}=\sum_{p=l_i}^{r_i}\sum_{t=0}^k\binom{k}{t}f_{i-1,k-t}p^t\\ =\sum_{t=0}^k\binom{k}{t}f_{i-1,k-t}\sum_{p=l_i}^{r_i}p^t \end{aligned} \]

自然数 \(k\) 次幂和拉格朗日插值计算。

将上述整数贡献和小数贡献合并一下就是答案,复杂度 \(O(nk^2+n^2)\)

code

CF1264E:

求期望三元环个数,\(O(n^3)\) 枚举并定向,最后除以总方案数。

求最大三元环个数。

对于竞赛图三元环计数我们有 \(\binom{n}{3}-\sum_{u=1}^n\binom{out_u}{2}\)
发现只需要让后面的最小即可。

给无向边 \((u,v)\) 定向,要么使 \(deg_u\gets deg_u+1\),要么使 \(deg_v\gets deg_v+1\)。二选一,考虑费用流。

注意到贡献是二次的,考虑将 \(deg_i\) 增加 \(1\) 的代价差分。差分数组是递增的,这满足了费用流的贪心性质,也就是说满流的边一定是差分数组的一个前缀。至此我们可以用左侧一排点表示未定向的边,右侧一排点表示原图点的 \(deg\) 值,建图:

  • 连接源点和左侧点,容量为 \(1\),费用为 \(0\),表示这条边对 \(deg\) 造成总量为 \(1\) 的贡献;
  • 连接表示边 \((u,v)\) 的左侧点和表示点 \(u,v\) 的右侧点,容量为 \(1\),费用为 \(0\),表示 \((u,v)\) 可以对两个点产生贡献;
  • 在每个右侧点和汇点之间连 \(n\) 条边,容量为 \(1\),费用分别为 \(deg\) 数组从 \(0\)\(n-1\) 的差分。

答案为 \(\binom{n}{m}-mincost\)

9.3 B:

给你模板串 \(T\)\(n\) 个字符串 \(S_i\),你需要从这 \(n\) 个字符串里截取出若干字串拼成 \(T\),从第 \(S_i\) 截取一次子串的代价为 \(c_i\),问你最小代价和方案数。

\(|T|\le 10^5,n\le 200,|S|\le 3\times 10^4\)

先考虑一个字符串 \(S_i\) 能否匹配字符串 \(T\) 的某个子串的问题,不难发现我们有经典 trick,我们把 \(T\) 放到 \(S_i\) 的 SAM 上跑一边,记录每个前缀 \(T[1:j]\) 的最大匹配长度 \(len_{i,j}\),如果对于子串 \(T[l:r]\)\(l\ge r-len_{i,r}+1\),那么就能匹配上。

那我们不难列出 \(O(|T|^2n)\) 的 DP 式子,我们设 \(f_i\) 表示拼成 \(T[1:i]\) 的最小代价,那么有:

\[\begin{aligned} f_i&=\min_{j=0}^{i-1}\{f_j+\min_{i-len_{k,i}\le j}c_k\}\\ &=\min_{k=1}^n\{c_k+\min_{i-len_{k,i}\le j}f_j\} \end{aligned} \]

容易发现那个 \(\min f_j\) 就是一个后缀 \(\min\) 的形式所以可以很轻松用树状数组优化成 \(O(|T|n\log|T|)\)

9.4 C:


首先有比较显然的树上背包:

\[f_{u,i}=\sum_{j+k=i}f_{u,j}f_{v,k}\\ f_{u,1}\gets f_{u,1}+w_u \]

显然这是可以卷积的,那么就有了一个分治 NTT 卷儿子的做法。

但是复杂度不对,上个链或者菊花就能卡掉,我们考虑重链合并。

具体的我们设 \([x^i]F_u(x)=f_{u,i},G_u(x)=\prod_{v是轻儿子} F_v(x)\),那么有转移 \(F_u=G_u\times F_{son_u}+w_ux\)

对应的,写成转移矩阵有:

\[\begin{bmatrix} G_u &0\\ w_u &1 \end{bmatrix} \]

答案矩阵有:

\[\begin{bmatrix} F_u &x\\ \end{bmatrix} \]

所以我们就有了一个对于轻儿子使用分治 NTT 暴力卷,对于重链我们也使用分治 NTT 暴力卷的重链合并大常熟 \(O(c^3n\log^3n)\) 的做法。

code

9.5 B:

我们定义矩阵 \(A\) 的一个变换为 \(f(A)_{i,j}=A_{i,j}\oplus A_{i+1,j}\oplus A_{i,j+1}\oplus A_{i+1,j+1}\),求 \(f^k(A)_{0,0}\)

共有 \(q(q\le 10^7)\) 次询问。

不难发现每次变换对于每一维相当于走了一步或者不动,那么 \(A_{i,j}\) 对于 \(f^k(A)_{0,0}\) 的贡献为 \(\binom{k}{i}\times\binom{k}{j}\)

根据 Lucas 定理我们有当且仅当 \(k\& i=i\land k\& j=j\)\(k\& (i|j)=(i|j)\)\(\binom{k}{i}\times\binom{k}{j}\) 才为奇数,
所以可以按照 \(i|j\) 分组然后做高维前缀和可以做到 \(O(n\log n+q)\) 的复杂度。

code

9.5 C:

给定数轴上的 \(n\) 个闭区间 \([l_i,r_i]\),现在将这些区间分成不多于 \(k\) 个集合,求每个集合区间交的和的最大值。

如果存在交为空的集合,显然只能有一个。然后其余
的集合大小一定为 1,否则可以只保留里面长度最长的线段。只要按长度排序,贪心选择最长的那些。

否则先将完全包含某条线段的线段拿出来,那么剩下的区间左右端点均单调。

我们可以按照左端点排个序,因为区间不包含所以我们左右端点都是单调的,这时候我们的 \(k\) 个区间一定是连续的一段,直接 DP 即可。

具体的,我们设 \(f_{i,j}\) 表示前 \(i\) 个区间分成了 \(j\) 个集合的权值和最大值,那么有转移:

\(f(i,j)=\max\limits_{k<j}(f(i-1,k)+r_{k-1}-l_j)\)

DP 的同时记录一下前缀 \(\max\) 就好。

最后与完全包含了某个其他线段的线段的贡献合并一下就可以得到答案了。

9.5 D:

求树上有多少连通块权值小于等于 \(m\)

连通块权值定义为各点权值乘积。

\(n\le 2000,m\le 10^6\)

有朴素的树上背包策略,但是复杂度 \(O(nm\ln m)\),接受不了。

考虑重新设计状态,我们设 \(f_{i,j}\) 表示以考虑到第 \(i\) 个点目前还剩 \(j\) 的容量空余的方案数,因为 \(j=\lfloor\dfrac{m}{k}\rfloor\),所以取值只有 \(O(\sqrt{m})\) 量级。

但是这个状态无法进行子树的合并,所以时间复杂度反而退化成了 \(O(n^2\sqrt{m})\),我们发现这实际算的是以 \(u\) 为根的子树贡献,所以我们可以考虑点分治。

那么就有了一个 \(O(n\sqrt{m}\log n)\) 的做法。

code

9.6 A:

区间平方,求区间和,但是模数 \(998244353\)

发现最后的答案是形如一个 \(\sum a_i^{2^k}\bmod 998244353\) 的形式,根据扩欧有:

\[\sum a_i^{2^k}\equiv \sum a_i^{2^k\bmod \varphi(p)}\pmod p \]

因为 \(p=998244353\),所以 \(\varphi(p)=p-1=998244352=2^{23}\times 119\),打个表发现有 \(2^{23}\equiv 2^{47}\pmod {p-1}\)

恭喜我们找到循环节了,那我们就可以对于每个 \(a_i\) 去维护他的 \(\forall k\in[0,46]\)\(a_i^{2^k}\)

然后那线段树简单维护一下就好了

code

bzoj3895:

考虑没有堆的石子数量为 \(1\) 的情况,那么胜负情况只和 \(n-1+\sum a_i\) 的奇偶性有关

再来考虑有石子数量为 \(1\) 的情况,我们不妨设 \(f_{i,j}\) 表示有 \(i\) 堆石子数量为 \(1\),剩下石子的 \(n-1+\sum a_i\)\(j\) 先手必胜还是必败。

然后发现只有四种情况:

  1. 从石子数为1的堆里取一个;
  2. 将两堆石子数为1的堆合并;
  3. 把石子数为1的堆与一个石子数不为1的堆合并 ;
  4. 从石子数不为1的堆里取走一个

9.6 C

\(2n\) 个点和 \(m\) 条边,点 \(i\) 度数为 \(j\) 时会带来 \(p_{i,j}\) 的代价,求出一张左边为点 \(1\cdots n\) ,右边为点 \(n+1\cdots 2n\) ,边数恰为 \(m\) 的二分图,满足所有点的代价之和最小且这张二分图的最大匹配在 \([l.r]\) 之间。

一个图的代价只与每个点的度数有关,所以我们把左右两边分开独立考虑,最后再合并。

具体的,我们将一侧的 \(n\) 个点分为 \(S,T,?\) ,如下图。

满足 \(S_1\)\(T_2\) 之间有 \(|S_1|\) 的匹配,\(S_2\)\(T_1\) 之间有 \(|S_2|\) 的匹配,左右两侧的 \(?\) 均没有连边,且 \(T_1\)\(T_2\) 之间没有连边,假如满足以上限制那么两边的答案合并起来就可以满足没有形成额外的匹配。

接下来就是怎么求了,我们可以设 \(f_{i,j,k,l}\) 为有 \(i\) 个点在 \(S\) 中,\(j\) 个点在 \(T\) 中,\(S\) 中的度数和为 \(k\)\(T\) 中度数和为 \(l\) 的最小代价,对于两侧分别求解,最后合并就好。

关于为什么不会多出额外的匹配,因为唯一可能多的边就是 \(S_1\)\(S_2\) 之间连的边,但是由于 \(S_1\)\(S_2\) 已经匹配满了,所以不会形成额外的匹配。

code

9.9 B:

人类智慧 \(SG\) 函数,假设每一个点有一个权值 \(f_u\),定义一个没有出度的点 \(f_u = 0\) ,其他每个点权值为他所有能一步到达的点的权值的 mex。定义 \(g(x)\) 为所有权值为 \(x\) 的点的点权异或和,整个游戏的权值是 \(\sum g(x)\)

那么容易说明满足 对于任意一个权值为 0 的局面进行一次操作权值会不为 0,一个权值不为 0 的可以通
过一次操作使得权值为 0,那么可以据此判断胜负。
至于构造方案,只要找最大的 \(i\) 使得 $g(i)\ne0 $,然后选取一个点操作一下,容易说明必然可以找到这样
的点。

9.9 C:


判断字符串是否相等考虑字符串哈希,我们设 \(f(i,k,B)\) 为从下标为 \(i\) 开始,长度为 \(2^k\) 的蝴蝶变换,进制为 \(B\) 的字符串哈希值。设 \(n = i+2^k-1\) ,则有
\(f(i,k,B) = \sum \limits_{j=i}^{n}s_j\times B^{n-j}\)

众所周知蝴蝶变换是可以倍增求的,所以哈希值自然也可以倍增,下面是式子。

\(f(x,i,B) = B\times f(x,i-1,B^2)+f(x+2^{i-1},i-1,B^2)\)

直接倍增是 \(O(n\log^2n)\) 的,所以我们考虑在每层用不同的 \(B\) ,定第 \(i\) 层的 \(B\) 是第 \(i-1\)\(B\) 的平方,那么复杂度就变成 \(O(n\log n)\)

9.9 D:

按位与是单调不增的,按位或是单调不降的,所以划分集合问题简化为序列分段问题,把它从大到小排序之后就是找是否存在一个点,使得前缀与等于后缀或,进而可以使用经典的 trick : 前缀/后缀与和前缀/后缀或的值只会改变 \(\log v\) 次,线段树维护一下即可。

Invincible Hotwheels:

CF1483F:
弱化版比较简单,考虑枚举每一个串 \(s_i\) 作为最长串,那么对于其它的所有串 \(s_k\ (i\neq k)\)\(s_i\)\(s_k\) 符合题意当且仅当 \(s_k\)\(s_i\) 中的出现次数等于 \(s_k\)\(s_i\) 中不被别的串所包含的出现次数。考虑怎么求后者:倒序枚举 \(s_i\) 的每一个位置 \(j\) 作为与别的串 \(s_k\) 匹配的结束位置。找到最长\(s_k\) 使得 \(s_k=s_i[j-|s_k|+1:j]\),如果 \([j+1,|s_i|]\) 中所有位置与别的串的成功匹配的左端点的最小值 \(pre\) 大于 \(j-|s_k|+1\),那么这就是 \(s_k\) 的一次不被别的串所包含的出现。维护 \(pre\) 直接用 \(j-|s_k|+1\) 更新即可,前者拿树状数组求一下就好了。

对于这个串,我们仍枚举作为最长串的 \(s_k\) ,同时枚举它的前缀 \(s_k[1\dots i]\) ,那么当前前缀在 \(fail\) 树上的父亲节点均被其包含,所以我们仅保留这个前缀对应的前两长的串作备选答案。

而后对于我们所有可能成为答案的串,它能成为答案当且仅当

  1. 包含它的区间存在,且均为同一颜色;
  2. 该串所有出现位置均作为最长、次长后缀。
    我们把这些串按左端点升序右端点降序排序之后对于扫过的每一个字符串我们把它出现的位置区间作区间染色,这样如果一个字符串被 \(2\) 个及以上颜色包含,那么其不能成为备选答案。

对于第二个限制,我们把所有次长的字符串对应 \(dfn\) 序的位置 \(+1\) ,最后对每个字符串字数求和即可。

code

9.12 A:

你只能花 \(\le2\) 块钱,\(n\le1000\)

容易想到两种方法。

  1. 每次选择最大的数翻到第一个,最劣总代价 \(\frac{1}{2}+\cdots+\frac{1}{n}\) ,这是 \(\log\) 量级的。
  2. 归并,每次把前 \(\frac{n}{2}\) 小的放到左边,后 \(\frac{n}{2}\) 放到右边,然后递归下去,这是严格 \(\frac{n-1}{2}\) 的。

我们机智的将两个方法合起来,先把前 \(\frac{n}{2}\) 小的放到左边,后 \(\frac{n}{2}\) 放到右边,然后对后 \(\frac{n}{2}\) 进行 1 操作,这样代价和为 \(\frac{1}{\frac{n}{2}}+\cdots\frac{1}{n}\) ,最劣是 0.7,同理对前 \(\frac{n}{2}\) 进行同样的操作,加上一开始归并一层的 0.5 ,最劣代价和为 1.9 ,可过。

9.12 B:


首先可以找出 \(l, r\) 点对应的数字 \(L,R\),两侧不全的特判掉,这样就变成了在串 \((L)_2 \cdots (R)_2\) 里面找一个字典序最大的。把这个放在线段树的区间上,即外面可以将其拆成 \(\log V\) 个区间分别求最大值,这样每个区间的询问就简单很多。下面就只需要考虑在区间\([X,X+2k)\) 的答案,容易发现如果要前缀 1 的个数最大化的话,开头一定会选在 \(X+2k-1,X+2^{k-1}-1\) 的最后几个1 那里。直接把 \(log\) 个区间找出来的可能的起始点拿出来比较就可以了。复杂度 \(O(Σn_i+q\log V )\)

9.12 C :

一棵树,叶子顺序连成一个环,边有边权,有 \(m\) 次查询,每次查询 \(x\)\(y\) 的最短路。

考虑边分治,跨过这两棵子树的边共3 条,从这 3 条边开始跑最短路。那么之后的答案就可以不考虑经过这 3 条边的,递归到子树做就可以了。复杂度 \(O(n\log n+q\log n)\)

9.13 C:


把列状压后矩阵快速幂,但是不太能过,细细的想一下列的合法状态不会很多,搜出来发现最多是 20 个,可过。

9.13 D:

对于每个点,称距离其最近的黑点为配对黑点。

观察到:对于子树 \(u\) 的所有点,其配对黑点至多只有 1 个在子树外(若有多个可以只留距离 \(u\) 点最近
的)。

\(dp[u][j]\)\(u\) 子树合法,且 \(u\)\(j\) 配对的最小花费,记 \(f[i] = \min(dp[i][j])\) ,则最后答案为 \(f[1]\)

考虑如何转移,第二维只考虑 \(dis(u,j)\le d[u]\) 的状态,对于 \(u\) 的每个儿子 \(v\)

  • \(v\) 子树的配对集合完全在子树内,贡献为 \(f[v]\)
  • \(v\) 子树的配对集合除了 \(j\) 点都在子树内,贡献为 \(f[v]-c[j]\)
  • \(v\) 子树的配对集合有在子树外但不是 \(j\) 的点 \(j'\) ,则不是最优解。
    转移方程为 \(dp[u][v] = c[j]+\sum\min(f[v],dp[v][j]-c[j])\) ,时间复杂度 \(O(tn^2)\)

9.14 C:


这里只摆一个不会证的结论,记 \(cnt[x]\) 为所有满足 \(d[i]=x\) 的个数,然后从 \(n\) 到 1 倒着枚举,同时开一个初值为 0 的计数器 \(sum\) ,在碰到第一个非零数之后,\(sum = \lfloor \frac{sum}{2} \rfloor+cnt[x]\) 中途 \(sum\) 不能为 0 ,若执行到最后即为合法。

这样问题就转化成分配 -1 使之合法的方案数了,使用背包 \(dp\) 即可。

9.16 A:

排列的三维偏序。感觉很厉害啊。

记:

\[K(x,y) = [a_x>a_y]+[b_x>b_y]+[c_x>c_y] \]

\[S(x,y) = \max{K(x,y),K(y,x)} \]

不难发现 \(S(x,y)\) 的取值只有 \({2,3}\)

最终求得答案为 \(\frac{1}{2}\sum_{1\le x,y\le n}[S(x,y)==3]\)

接下来我们默认 \(x<y\) 。令:

\[A = \sum_{1\le x,y\le n}[S(x,y) == 3] \]

\[B = \sum_{1\le x,y\le n}[S(x,y) == 2] \]

这是 \(A\) 就是我们要求的答案。
如果令:

\[P_{a,b} = \sum_{1\le x,y\le n}[a_x<a_y][b_x<b_y] \]

容易发现:

\[A+B = \binom{n}{2} \]

\[3A+B=P_{a,b}+P_{a,c}+P_{b,c} \]

9.16 C:

树上阶梯博弈,注意 \(b_i\) 为 0 的点会分割成另一个独立的游戏即可。

XYYHHTT - Catch Sheep:

操作似乎不可逆,所以使用换根 \(dp\) 经典 trick,类似 Sloth ,维护前缀卷积和后缀卷积,up and down 就好了。

9.19 A:

一个重要的性质就是最多连着两个 -1 ,其他没了。

9.19 B:

膜拜yhx

9.20 C:

首先要观察出答案有可二分性,然后二分答案考虑如何 check。

3,2,1,上链接。

手持ち花火 (Sparklers):

Colorful Tree:

\(O(n^2)\) 很平凡,考虑如何优化。

容易发现第二维复杂度跟子树内叶子个数有关,用类似长剖的思想继承重儿子,暴力合并轻儿子就好。

好像写线段树合并也行。

Master Spark:

幽默计算几何题

已知有两种做法。

一种是对每条 Spark 边界线,看其他 Spark 是否覆盖掉了它
在游戏区域内的所有区段,如果没有覆盖完,则说明有安定点,
这样就是一个线段覆盖问题。

另外一种就是把所有交点求出来,然后扫描线 + 点事件来
维护所有 Spark 边界线的上下位置,然后维护一个前缀和之类的来看中间是否有空隙。

[六省联考 2017] 相逢是问候:

对一个区间连续进行 \(k\) 次操作后就可以缩一块了,\(odt\) 维护就行

9.24 A:

区间加,查询区间小于等于一个数的个数可以分块求,复杂度 \(O(n\sqrt n\log \sqrt n)\) ,但是可以优化。

  1. 容易发现修改之后,一定是一部分数增加 \(k\),一部分数不变,将这两部分归并即可完成线性排序。
  2. 查询 \(\le k\) 的个数,可以通过离线,排序询问,就能将二分的过程转化为维护一个指针。

这样就把 \(\log\) 去掉了。

组合数行求和可以用分块打表的思想预处理。复杂度 \(O(n\sqrt n)\)

题解是拿莫队求的,直接膜拜。

Spiders Evil Plan

原来带边权长剖之后暴力跳链顶是 \(O(n)\) 的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/802905.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pom.xml中引入项目中的jar包(通过<scope>system</scope>依赖本地jar包)

<dependency><groupId>com.hbis.infmgr</groupId><artifactId>sign-utils</artifactId><version>0.0.1</version><!--此处忽略sonar警告,因报表组件是定制化的本地包,放到了项目目录内,所以需要通过system-scope引入--><…

《NET CLR via C#》---第十二章(泛型)

泛型(generic)是CLR和编程语言提供的一种特殊机制,它支持另一种形式的代码重用,即“算法重用”。 简单来说,开发人员先定义好算法,必然排序、搜索、交换、比较或者转换等。但是,定义算法的开发人员并不设定该算法要操作什么数据类型;该算法可广泛地应用于不同类型的对象…

Java对接企业微信审批回调

一、需求说明用Java程序对接企业微信的审批流程,获取审批数据数据,例如:报销费用金额二、操作步骤 2.1、分析需求根据需求分析其实也不知道该怎么去做对接,通过不断试错,发现不需要对接第三方应用,也就是不需要进入服务商后台页面,只需要在自建应用是做好配置即可。 具体…

Vuex 和 Vue-router 知识点

Vuexactions里面才能做异步操作(访问后端API ajax请求 访问数据库中的数据) mutations原子操作,同步操作Vue-routermode:history 路由配置该怎么配置就怎么配置 route: [...]配置:path 和 component懒加载:component:对应一个函数,import导入这个组件。前面说过用impor…

Chrome浏览器下载时提示“保留”

1. 提示情况 具体提示情况情况如下:2. 解决方法 2.1. 选中地址栏“查看网站信息” 具体弹出框如下 2.2. 修改“网站设置” 在确认网站安全的情况下,把“自动下载项”修改为“允许”,把“不安全内容”修改为“允许”。2.3. 关闭“网站设置”页面 重新下载,就不在出现“保留…

利用IDEA创建Web Service服务端和客户端的详细过程

创建服务端 一、file–>new–>project 二、点击next后输入服务端名,点击finish,生成目录如下三、在 HelloWorld.Java 文件中右击,选 WebServices ,再选 Generate Wsdl From Java Code ,确定点击ok会自动给我们生成HelloWorld.wsdl,画红线处注意四、配置tomcat,此…

9.24上课记录

今日收获:可以用来阅读知网等 https://cajviewer.cnki.net

怎么去除URL地址中index.php文件?

PbootCMS内核框架采用单入口pathinfo方式,因此所有地址的访问默认都带有index.php, 要去除它很简单,只要开启伪静态即可扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网…

Win10系统复制、粘贴、新建、删除文件或文件夹后需要手动刷新的解决办法

有些win10系统可能会出现新建、粘贴、删除文件或文件夹后保持原来的状态不变,需要手动刷新,我这边新装的几个系统都有这个问题,已经困扰很久了,我从微软论坛和CSDN社区找了了很多方法都没解决,微软工程师给的建议包括重置资源管理器、修改注册表、用CMD修复等等,都没解决…

思导初识

今天的课程分为三部分的学习,一个是思维导图的制作,一个是pdf的转换以及二维码的生成。 通过本节课的学习,我们认识到了Xmind、亿图图示的思维导图制作软件,并初步进行了制作学习,作为第十一小组,我们选择了《海上日出》进行思导的制作。 此外,我们新学习了几个pdf转换的…