10.22
P14046
考虑到对于一个会放回书的点,其一定满足单调性,考虑用这个东西做题。
那我们就考虑求出来这个单调的分界点就可以在复杂度正确的情况下做了。
考虑直接算出分界点,就是 \(lst_i\to i\) 中的颜色数量。直接扫描线 \(+\) BIT 就好了。
然后算答案是区间 \(+\),单点查,用差分 BIT 就好了。
很好的根号分治题
大概意思是对于一次函数 \(kx+b\),有几种分治方向:
- 可以对于 \(k\) 分治,如果其有上限,那么分治范围为 \(\sqrt V\),两部分中大的部分值分散,直接处理。
- 可以对有取模操作的数/整除操作的数分治,原理也是分散,但是若取模的数很小,可以寻找取模后的数直接讨论。
复杂度分析的时候用均值不等式/底数相同来权衡一下,不一定直接就是 \(\sqrt n\)。
P9584
我不会换根,考虑计数器。经典结论就是这条边会用 \(siz_u\times n-siz_u\) 次。考虑新加的点怎么搞。
对于其子树,贡献为 \(siz_u\) 次,否则贡献为 \(n-siz_u\) 次。我们维护这玩意 \(\times w_i\) 的子树和就好了,查询的时候就扣出来加上。
P11624
考虑答案的组成:
- \(dep\) 相同。
- \(LCA\) 为根节点。
第一种直接用桶。第二种先考虑根节点的贡献,然后用乘法原理把根连的子树一个一个加上就好了。
P11627
原作者:Genius_Star
考虑转化式子:
故我们只需要最大化:\(\sum_{u = 1}^n \operatorname{dis}(u, t)\)
容易预处理出 \(siz_i\),设 \(w_i\) 表示边权,则要最大化:\(\sum_{i = 1}^{n - 1} siz_i w_i\)
由于 \(w\) 是一个排列,故考虑贪心即可,按照 \(siz\) 的值从大到小分配 \((n - 1) \to 1\)。
由于我们需要枚举 \(t\),故考虑换根 dp。即相当于在原来 \(\{siz_i\}\) 集合中删除 \(siz_u\),加入新的 \(siz'_{fa_u}\)。
故我们现在只需要做单点修改,全局下面式子的最大值:\(\sum_{i = 1}^{n - 1} siz_{v_i} w_i\)
考虑维护值域线段树 \([1, n]\),对于每个区间 \([l, r]\) 维护有多少个 \(siz_i\) 在这里面(设有 \(cnt\) 个),以及这些 \(siz\) 的和 \(sum\),以及考虑 \(w\) 是 \(1 \sim cnt\) 的排列时的最大值。
合并两个区间 \(cnt_l, sum_l, ans_l, cnt_r, sum_r, ans_r\) 时,显然有:\(cnt = cnt_l + cnt_r\),\(sum = sum_l + sum_r\)
对于右区间的 \(w\),显然要由 \(1 \sim cnt_r\) 的排列变为 \(cnt_l + 1 \sim cnt_l + cnt_r + 1\) 的排列,即 \(w\) 整体添加了 \(cnt_l\),故:\(ans = ans_l + ans_r + cnt_l sum_r\)
Karma
题面 回顾一下这道好题。
考虑贪心,怎么贪呢,尝试合并,看一下有那些贡献。我们设一个串有 \(3\) 种值 \(a,b,c\) 分别代表 \(0,1,\text{逆序对}\) 个数。
考虑两个串合并,如果 \(i\) 串在 \(j\) 串前。增加的贡献是 \(a_j\times b_i\),考虑如果要这样最小,那么满足 \(a_j\times b_i\le a_i\times b_j\),也就是 \(\frac{b_i}{a_i}\le \frac{b_j}{b_j}\)。直接排序即可。
同桌与室友
先习惯性连边,将双人宿舍关系看做是黑边,双人桌关系看做是白边,那么就是一个图同构的计数。
但是这个题每个人度数不超过 \(2\),所以每一个连通块要么是一个简单环,要么是一条链。
然后考虑分类计数:
- 如果有 \(x\) 个大小为 \(i\) 的环,那么这一部分答案为 \(x!\times i^x\)。
- 如果有 \(x\) 个长度相同,两段边同为黑或同为白的链,那么这一部分答案为 \(x!\times 2^x\)。
- 如果有 \(x\) 个长度相同,两段边不同色的链,那么这一部分答案为 \(x!\)。
P5921
题面转化:给定一张有向图,设添加最少 \(m\) 条边 可以使得整张图存在欧拉路径。 请输出 \(m+n+1\)。
欧拉路径是指经过图中每一条边的路径。
先看一下一些性质:
有向图下:\(\sum_{i\in G}in_i-\sum_{i\in G}out_i=0\)。
关于有向图欧拉路径:
- 若满足\(\sum_{i\in G} |in_i-out_i|=0\),则这张图存在欧拉回路。
- 若满足\(\sum_{i\in G} |in_i-out_i|=2\),则这张图存在欧拉路径。
- 若满足\(\sum_{i\in G} |in_i-out_i|> 2\),则一定可以添加一条边使得这个和 \(-2\)。
- \(\sum_{i\in G} |in_i-out_i|\) 一定是偶数。
考虑对每个联通块计算答案,假设一共有 \(s\) 个联通块,那么最终答案就是:
直接并查集就好了。
CF859E
依旧计数,考虑建图。我们发现每个点的出度 \(\le 1\)。所以会构成如下情况。
- 树
- 基环树(环可能是自环)
- 自环
对每一个图形分别考虑答案,然后用乘法原理乘起来就好了。
- 对于树:定点一定是空的,其他都是有人的,考虑把一条链向前挪一步。所以方案数为 \(siz\)。
- 对于自环基环树:只有一种答案。
- 对于长环(环长 \(\le2\))基环树:有两种答案,就是环上挪一步/不动。
- 对于自环,只有一种答案。
接下来用并查集就可以维护这几种图形了。
HDU-4336
方法一,直接用期望,设计状态 \(f_S\) 表示已经获得 \(S\) 需要拿满的期望天数。那么有:
时间复杂度 \(O(n2^n)\)。
方法二,用 min-max 容斥,有这个式子。
而且显然 \(\min_{i\in S}{x_i}=\frac{1}{\sum_{i\in S}p_i}\).
所以我们直接 \(dfs\) 把所有可能找到就好了。时间复杂度 \(O(2^n)\)。
bzoj2565
考虑用回文形式表达答案。我们设计两个数组 \(l_i,r_i\) 来表示以 \(i\) 作为左端点/右端点的最大长度,那么答案就是:
考虑从回文数组得到这个东西,那么我们可以直接把这个答案转移到边界,然后再取 \(\max\) 转移到中间,用 \(l\) 举例子来说就是:
当然在回文处理过的数组中略有不同。
loj6048
比较高妙的题。
考虑最终答案是什么,其实就是把这个数列以左侧对称后的 \(LIS\),然后就是板子了。
比如 \(123\to 321123\)。
计数的话,离散化完了用树状数组维护最大值及其方案数。

浙公网安备 33010602011771号