OwO
03.03 [USACO19JAN]
A. Redistricting
题意:给 \(g\) ,求 \(f(n)\) 。 \(f(i)=f(j)+[g(i)\ge g(j)],j \in (i-k,i]\) 。
离散化之后线段树优化 DP ;或者发现额外贡献最多只有 \(+1\) ,单调队列。
B. Exercise Route
题意:给一棵树和一些路径,求有边交的路径的对数。
把与 LCA 关联的点都 \(+1\) ,查询除 LCA 外路径上的点。这样除了两条路径 LCA 相同的情况外是没有问题的。相同的时候开 map 暴力统计答案,也可以科学一点,最后把每个点作为 LCA 对应的一堆二元组排序再统计答案。
C. Rain Tracking 2
题意:给 \(k\) ,以及 \(c_i=\min\{a_{i},a_{i+1},\cdots, a_{i+k-1}\}\) ,求合法 \(a\) 序列数量。
连续 \(i\) 个相等的 \(c\) ,设 \(x=10^9-c\) ,方案数是 \(f(i)=\sum_{j=1}^{k}x^{j-1}f(i-j)\) ,扰动一下得到 \(f(l+1)=(x+1)f(l)-x^kf(l-k)\) 。
相邻的 \(c_x>c_i\) 时,发现可以确定 \(c_i\) 对应区间一个 \(a\) 的值,并且另外 \(k-1\) 个位置要满足的限制是 \(\ge c_x\) 。当前讨论的是 \(c_i\) 的贡献,所以长度 \(l\) 应该减去 \(k\) ,然后再统计答案。
多个部分的答案乘起来就是最终答案。
03.14 [FJOI2018]
所罗门王的宝藏
限制如 \(a_i+b_i=c_k\) ,线性关系相加减还是线性关系,连边之后任意给一个未知数一个值, DFS 判断是否矛盾。
领导集团问题
% Newuser 大佬神仙贪心。
按第一关键字权值降序,第二关键字深度降序排序。讨论点 \(p\) ,在到根路径上如果有点被标记,把最近的点取消标记, \(ans\) 不变;如果没有, \(ans+1\) 。然后标记自己。之后树剖。
我想的是 DP , \(f(i,j)\) 表示 \(i\) 为根子树内选择的点最小权值恰好为 \(j\) 的最大可选点数。
\[f(i,j)=\sum \max_{son,k \ge j}\{f(son,k)\}+[A(i)=j]\]
想把第二维合在一起用线段,使得真正维护的元素的后缀和,等于 \(f\) 的后缀最大值。
叶节点的信息显然就是 \(A(i)\) 位置是 \(1\) ,其余是 \(0\) 的线段。
可以发现如果忽略 \([A(i)=j]\) ,直接把儿子合并(每一位置对应相加),就能得到当前节点的信息。
然后把 \(A(i)\) 位置 \(+1\) ,前驱 \(-1\) ,就可以得到完整的信息了。有点差分的意思吧,可以发现这样的确得到了正确的信息。
等等,前驱 \(-1\) ,取消标记,那这本质就是前面的神仙贪心?
代码特别好写, dsu +multi_set 可以 49 行写完。
邮递员问题
\(S,T\) 均两条线段两端时,画图运用三角不等式可以发现最优路径必不存在交叉的情况。
然后我就不明白了 QAQ 。咕咕咕。
Orz
10 + 0 +0 分,爆零预订。
A 题以为不用图论直接判标记,确定值就行。这样不对,线性关系必须依次推,不能把两堆东西合并之后判是否合法。这样的话合法的情况也很有可能被判为非法。
B 题嘛……脑子有点乱,写错了迭代器。暴力被我误删了,太智障了。
C 题想到了 \(S,T\) 在两端的结论,其他情况想枚举分割线,因为情况太多所以随机枚举一部分,然后两边用 DP 求解。可行但不一定最优,感觉很不正确,感觉收益率不大,弃了。
好惨啊 Orz 。
03.22 [来自浙江的不可告人的比赛]
A 容斥还是常见套路的,然而我认定了不能从新图推旧图,在求旧图上耗死了; B 题有点神仙,以为网络流或者图论,结果是生成树 + 图论; C 题需要考虑组合意义,没听明白,咕咕咕。
3.24 [51nod 2019 省选第二场]
A. 抽卡大赛
枚举每个人,每张卡的 \(a\) 值 \(a_0\) ,然后 DP , \(f(i,j)\) 表示前 \(i\) 个人抽卡后恰好 \(j\) 张卡满足 \(a_i>a_0\) ,然后算下贡献,加上去。整体 \(O(n^4)\) 。
设 \(t_i=f(n,i)\) 的 OGF 为 \(T(x)\) ,有 \(T(x)= \prod (p_i x + 1 - p_i)\) ,其中 \(p_i\) 是某个人抽卡 \(a_i>a_0\) 的概率,实际上是某人若干张卡片 \(p\) 值的和。
将所有人的所有卡片按 \(a\) 值排序,然后从大到小讨论。每次移动对 \(T\) 的影响仅仅是某个 \(p_i\) 增加了一个值,除以旧的,乘上新的。一次除法操作是 \(O(n)\) 的,因为有每次除的都是以前乘过的东西这个性质。乘法也是。
所以整体 \(O(n^3)\) ,据说多加 \(\log\) 会挂。
B. 异或约数和
整除分块,需要求异或前缀和。打表可得它的循环节是 4 。
C. 小朋友的笑话
对于每个笑话,以人为下标建立线段树。同时维护笑话和答案的线段树。
势能分析,对于笑话线段树,其实是在不停涂黑色,涂色区间原来是纯色区间时才可以结束。注意黑色区间是会合并的,并不会拖延之后的操作多次,整体就 \(O(n \log n)\) 了。
也可以用 set, map 之类的维护区间的并?差不多吧。
03.25 [USACO18DEC]
A.
设答案是 \(g(x)\) 有:
\[g(x)=\max\{f(x),\dfrac{g(x-1)+g(x+1)}{2}\} \tag{1}\]
注意 \(c=\max(a,b)\) 等价于 \(a \ge c, b \ge c\) 同时成立,且至少一个取等。
\((1)\) 式第二项限制使得:
\[g(x)-g(x-1) \ge g(x+1)-g(x)\]
对点集 \(\{(x,g(x))\}\) ,在 \(x\) 单增时,增量 \(h(x)=g(x)-g(x-1) \ge h(x+1)\) ,所以这个点集是一个上凸包。
对 \(\{(x,f(x))\}\) 建上凸包,如果点在凸包上,那就取 \(g(x)=f(x)\) 了;如果不在,增量 \(h\) 需要取等,就让斜率取等,取 \(x\) 在凸包上对应的值。实际上就是把点都取到凸包上。
B.
问题转化,一个元素的移动并不影响其他元素的相对位置。最终集合单增,因此选取的集合的补集单增。为了最小化最终集合大小,应该最大化补集大小,即求补集的 LIS 。原集第 \(k\) 小,因此求补集第 \(k\) 大 LIS 。
然后每个点维护二元组 \((len,f)\) ,表示以它作为开始的 LIS 长度和对应方案数, \(O(n \log n)\) DP 一下。
然后长度从大到小枚举,注意相同长度的 LIS 对应的开始位置的元素的值,从左到右单调递减。由于求第 \(k\) 大,所以尽量先考虑大的,从左往右考虑。然后类似权值线段树查第 \(k\) 大那样的贪心,取一下就可以了。
注意每个长度取到元素了就 break
掉,并标记不要再讨论左边的元素,然后枚举长度 \(-1\) 。算方案数的过程中和 \(10^18\) 取 \(\min\) (因为这个方案数随便构造一下,上界至少可以到 \((^n_{n/2})\) )。
C.
贪心,合法删除过程中一直只有一个连通块。每个先删 \(a\) 才能删 \(b\) 的限制连边 \(a \rightarrow b\) ,树边当作两条单向边。 \(a\) 为根的子树答案是 \(0\) ,问题是不知掉根在哪里。类似拓扑排序,取出入度 \(1\) 的节点,更新周围节点入度。最后剩下的点度数为 \(0\) ,就把它作为根,然后 DFS 一下,不要经过 \(\{a\}\) 中的点,标记到的点答案为 \(1\) ,没有到的点答案为 \(0\)。如果没有这样的点,说明有环,画图可以发现所有点答案都是 \(0\) 。
Orz
记住先打暴力,这样至少不会爆 0 吧……输出格式,看好了小朋友!
03.26 [JSOI2018] [AGC]
A. 战争
裸的柯和( Minkowski Addition ),运气可能比较好碰巧看过,就是求 \(\{c\}=\{a+b\}\) ,把两个凸包上的轮廓向量极角排序之后再做一次凸包就可以得到 \(\{c\}\) ,然后判断点是否在新的凸包内:二分,叉积。
B. 机器人
除了斜率 \(1\) 方向的格子全是同一个方向以外我好像啥也不懂,挖坑。
C. 列队
贪心。找到最大的 \(t\) 使得 \(a_t \le k+t-1\) ,然后 \(t\) 就将两边的人划分开,算答案时就不需要加绝对值符号了。
持久化线段树,维护区间内人的数量,人的位置的和,最右的人的位置,然后在递归中传一下可以放人的区间,根据左区间最右的人的位置决定一边贡献答案,另一边递归一下, \(O(n \log n)\) 。
然而卡常, awsl ,悄悄说一句被卡常的部分我空间也少开了一个 \(\log\) ,完蛋。
Orz
快一个月没碰几何了,差点裸题不会做,那真就白给了呀……
所以看了一波模板,补了两个小东西:
- 线段判交。快速排斥实验,就是 Kd-Tree 用来剪枝的那个东西,用线段的外接矩形判交,然而这只是线段相交的必要条件;跨立实验,就是当且仅当 \(a\) 两端点跨过直线 \(b\) 且 \(b\) 两端点跨过直线 \(a\) 时,线段 \(a,b\) 相交。 跨过直线的充要条件是,设 \(x=(a_0 \rightarrow b_0) \times (a_0 \rightarrow b_1),y=(a_1 \rightarrow b_0) \times (a_1 \rightarrow b_1)\) ,则 \(xy < 0\) 。
- 多边形重心。就是各个三角形重心,以面积为权值的加权平均数。把各个三角形重心数乘上三角形面积,加起来作为分子,分母是多边形面积。
[AGC021E Ball Eat Chameleions]
红色和蓝色,分别作为 \(x,y\) 坐标,枚举红球蓝球数量 \(r,b\) ,转化为 \((0,0)\rightarrow (r,b)\) 。
有的路径不合法。贪心地,优先先后给除一号宠物外的每个宠物 \(r,b\) ,无法做到时就给一号宠物。分析可以发现这样尽量让所有宠物变红了。一号宠物的红色球个数是 \(r-(n-1)\) 。
- 当 \(r>b\) ,如果 \(y-x \ge r-(n-1)\) ,那一号宠物就不能变红了。
- 当 \(r=b\) ,如果 \(y-x \ge r-(n-1)\) ,或者最后一个球,也就是最后给一号宠物的球,是红色,那一号宠物也不能变红。所以这时路径是 \((0,0) \rightarrow (r,b-1)\) 。
然后就是快速算不能经过直线的路径数,用 Catalan 的分析方法算一算就好了。好神仙啊这题。
抱歉,我忘了名字
题意:序列中有 \(0,1\) 和通配符,相邻三个数字可以变成出现最多次的那个,求最后剩下 \(1\) 的方案数。
wxh 的 DP 没看懂,大概能理解“毕克自动机”做法。就是普通的自动机构造,但是神奇地贪心了,有的状态总是比能同样能转移到的另一个状态好,所以每个点 \(0,1\) 对应的转移可以贪心地恰好构造为唯一的,这很重要。然后跑匹配, DP 算最后停在某个节点的方案数。
序列自动机
听到有大佬在说序列自动机,看了 OB's blog 里面 FJOI2015 那道序列自动机的题。就是维护每个字符后面添加一个字符能匹配到的最近的位置,类似链式前向星,用处是在公共子序列相关问题, \(O(|S| \cdots n)\)。听说 PopoQQQ 用主席树能把复杂度中字符集大小那里加个 \(\log\) ,没仔细看,咕咕咕。
03.27 [某名校 NOI 模拟] [雅礼 2018 Day10]
A.
题意:长度 \(2n\) 的序列,比如 \(0829\) 是 good 的,因为 \(02+98=10^n\) 。给一个含通配符的序列,求是 good 的方案数。
性质是两个数字对位相加的结果做高到低是若干个 \(9\) ,一个 \(10\) ,然后若干个 \(0\) 。
然后枚举 \(a\) 是结果为 \(10\) 的那个数字,即方案中一定有 \(a+b=10\) , DP 。
B.
题意:环上有一些权值,有一个点权均匀分布在 \([a,b]\) ,然后求什么概率。
把未知点权设为 \(x\) ,每个点的答案是一个一次函数,假设已经知道了。然后就是一些半平面 (\(k>0\)) 求上凸包,每条直线的答案的分子就是它在凸包上 \(x\) 坐标的差。
然后求那些一次函数,发现可以 \(O(n)\) 暴力 \(1\) 号点答案,前缀和推出其他的点 \(i\) 作为起点的答案。但是由于环的性质需要分类讨论 \(j\ge i\) 和 \(j>i\) 两种情况。
C.
咕咕咕。
A. 「雅礼集训 2018 Day10」足球大战
式子写出来,注意特判 \(p,q\) 为 \(0,1\) 的情况,因为不存在逆元。开空间,开常,只能 \(O(n)\) ,只能开一个逆元数组。
B. 「雅礼集训 2018 Day10」文明
据 Newuser 大佬说是虚数裸题 世界树 弱化版。某个点属于一个国家的充要条件是距离最小,或者距离相等时,国家的行动标号最小。
C. 「雅礼集训 2018 Day10」贪玩蓝月
裸线段树分治,注意背包时需要开一个临时变量存答案,因为模意义下不能简单通过枚举顺序来保证物品仅有一个。
03.28 [小概率是雅礼集训]
A. arg
题意:给出长度 \(m\) 的序列,求 \(1\) 到 \(n\) 排列中, LIS 是该序列的个数。
DP 套 DP ,求 LIS 的一种做法是: \(f(i,x)\) 表示前 \(i\) 个数字,长度 \(x\) 的 IS 的最小末尾数字,然后每次贪心地更新状态,或者把当前数字接到某个 IS 后面,作为当前最长的 IS 的末尾数字。
按照套路,果然又发现第二维是单调不降的。所以如果随便放数字而不是恰好放一个排列的话,直接差分,然后二进制状压内层 DP 第二维就可以。考虑数字有限制时,对数字状压,三种状态:未讨论,讨论过并且在内层 DP 的第二维,讨论过但不在内层 DP 第二维。每次枚举未讨论的数字进行转移,如果放了一个给定序列中的数字 \(a_i\) ,需要保证 \(a_{i-1}\) 已经讨论过。模仿内层 DP 更新状态,或者把数字接到末尾就行了。
B. bsh
题意:给三角剖分图,边权为 \(1\) ,询问两点间最短路。
类似 旅行者 (好像是这个名字),那是一道网格图分治。这道题对多边形分治就好了。
然而我码力太差,写了非常久,第一次用 vector<vector>
。
C. cti
题意:一些有向炮台,可以打一炮,但是弹道不能相交,求最大收益。
网络流。某条弹道过了交叉点,另外一边就不能过。转化一下限制,调整边的方向,拆点,加上限制,跑最小割。
Orz
今天翻车了 Orz ……虽然一直很菜,不过……一言难尽。
三道题开场就看出了考察方向,然后挑了最熟悉的 DP 模型,以为是裸题能很快水过,然后 3h 过去了。分治题一开始以为是有简单性质,最后一个小时才觉得只能分治。思路简单,然而没写过类似的题,暴力。网络流日常心理障碍,尝试克服,无法克服,开始暴力,发现暴力打着真费劲,放弃。
然后就翻车了。
教训:网络流还是多想想吧,毕竟性价比比较高,不像复杂 DP 或者数据结构之类的东西容易白耗时间。然后相信:我一定能在 30min 内写对 200 行代码。
03.29
上午打我和 211 的互测题。
A 题裸 Mobius + 莫队,成功用 \(n=m=a_i=100\) 的假样例让 hdhd 大佬看错输入格式,拍了一个小时没挂,最后 10 分。我没有被阿,嘿嘿。
B 题组合数求和,需要模型转化,考虑一三象限有一些点,求路径方案数, DP 一下。
C 题正解是差分之后线段树维护,找右边第一个大于 \(v\) 的位置。 hdhd 大佬 map + 势能分析通过。考虑许多单调区间,修改操作会使得一些区间合并,一开始有 \(n\) 个长度 \(1\) 的区间,修改操作只会增加至多 \(2\) 个区间。
03.30 [自闭省选模拟]
A.
题意:给一棵树,有一些炸弹在节点上,造成的伤害每扩展一条边就 \(-1\) ,直到为 \(0\) ,求每个节点受到的伤害和。
点分治,计算子树中炸弹对其他子树的伤害(实际上也贡献到了炸弹所在子树中,所以每次统计答案时需要对所有儿子再进行一次负贡献来消除影响)。然后差分 + 后缀和统计每个深度的答案。
B.
小C的锦标赛弱化版, \(n=5000\) 。
题意:求至少含一个 \(k\) 元环的带标号竞赛图数量。
考后补的竞赛图性质:
- 如果竞赛图含有 \(k\) 元强连通分量,那么存在所有 \([3,k]\) 元环。
- 竞赛图的拓扑序唯一,即缩点后入度为 \(0\) 的点仅一个。
问题转化:求至少包含一个 \(\ge k\) 元强连通分量的竞赛图数量。
先考虑 \(n\) 个点且包含 \(n\) 元强连通分量的竞赛图数量 \(f(n)\) ,设 \(g(n)\) 表示任意竞赛图数量,枚举点集中最小点最小的强连通分量,然后关联的所有边起点只能是该点集:
\[g(n)=\sum_{i=1}^{n}f(i)g(n-i)(^n_i)\]
再次转化问题,设仅由 \(<k\) 元强连通分量组成的竞赛图数量 \(s(n)\) :
\[s(n)=\sum_{i=1}^{k-1}f(i)s(n-i)(^n_i)\]
答案是 \(g(n)-s(n)\) 。然后变化一下式子,多项式求逆。
C
题意:给一棵树,代价轻边 \(1\) ,重边 \(\lceil \log_2^{l}+1 \rceil\) ,叶子代价为到根代价和。求叶子代价最大值最小是多少?
正解神仙贪心 + DP ,长链剖分可过 60 。
Orz
注意卡常,调整心态,信仰暴力能得分,就算 Subtask 什么的也要信仰。
03.31 [自闭 AGC030] [51nod 省选模拟 2019 第三轮]
AGC030 E
模型转化,红线蓝线,选一个匹配, \(O(n)\) 计算当前答案,总共 \(O(n^2)\) 。
AGC030 F
全 -1 时是 Catalan 数,推广, DP 。
[51nod] A.
两个分母互素的分数之和为整数,这两个分数分别为整数。如果明白了这一点,并且会写 Pollard Rho ,您就可以通过此题。
[51nod] B.
咕咕咕,神仙计数。
[51nod] C.
SBT 套 Trie ,可是我不明白 Trie 维护权值是什么意义,但据说这种操作是一种对给定区间排序的套路。
04.01 [长乐一中集训]
A. 遮天蔽日
计算几何,多边形重心。
B. 三元组
题意:求序列中 \(A[l,mid],B[mid+1,r]\) 满足 \(A,B\) 是回文串的所有情况的 \(\sum l \times r\) 。
\(Ans = \sum x_i y_{i+1}\) , \(x_i\) 表示以 \(i\) 结尾的回文串的左端点下标和, \(y_i\) 表示以 \(i\) 开头的回文串右端点下标和。 Manacher ,差分,前缀和。
C. 最优价值
最大权闭合子图。
Orz
又翻车了,再不提前打暴力我就 XX 。网络流模型以为套不上最大权,一直卡在最小割上了。主要是策略有问题,最后几十分钟一道题没做,竟然还不打暴力,企图搞出 C 题。
04.02 [HNOI 2018 省队集训 6-25] [Newcoder 2018 ACM]
A. gift
题意:定义序列 \(A\) 变成到 \(B\) 的代价为需要执行交换两个位置的数字这个操作至少进行的次数。给两个有空位的序列,求代价为 \([0,n-1]\) 的方案数。
神仙题。至少交换次数等于 \(n-p\) ,其中 \(p\) 为置换中循环节个数。如果两个序列都是给定的,那么问题就是求环的数量。
对于空位,分为三类连边:空位仅在左,仅在右,左右有。然后斯特林和容斥部分我还不太理解。
B. girl
题意:给出 \(a,b,c,n\) ,求 \(\sum_{0 \le i < j < k < n}ai+bj+ck\) ,满足 \(i,j,k\) 中任取两个均不存在于给出的限制集合 \(\{(x,y)\}\) 中。
没有限制,算下 \(a,b,c\) 的系数就可以了,得到答案 \(s\) 。
有限制,设 \(x\) 表示至少满足 \(i,j\) 存在于限制集合的三元组的贡献和,类似地,设出 \(y,z\) ,答案为 \(s-|x \cup y \cup z|\) ,容斥一下。
形如 \(|x|,|x \cap y|\) 的部分比较容易求,考虑计算 \(|x \cap y \cap z|\) ,即三元环的贡献。
根据 luogu 上的 post ,这个可以 \(O(m \log m)\) 做。对于无向图,度数大的向度数小的定向,相等时根据标号随便定一下。
这样构造的是一个 DAG 。然后:
for (0 <= i < n) {for (i -> j)mark[j] = i;for (i -> j)for (j -> k)if (mark[k] == i)papapa}
string
SAM + LCT 。
[Newcoder] The number of circuits
看一下 BEST Theorem ,暴力高斯消元算下答案,扔进 BM 里。
所以营养成分主要是 BEST Theorem 和复习高消。
04.04 [FJWC2019 DAY1]
全连
一开始粗略算了下数据范围以为要写高精,看了下时限以为要用一个 long long
和一个 int
模拟高精卡常。然而并不需要,两个限制,主席树会爆空间,所以每次并不直接加入状态,扔到堆里面,需要用到的时候再拿出来,在线段上上做对应修改。
原样输出
从后往前建立 SAM ,然后对于没有转移的点,连向上一个字符串的转移位置,得到一张 DAG ,拓扑排序算一下从起点出发的方案数。
不同的缩写
搜索 + 剪枝 + 二分图匹配。一个串如果有超过 \(n\) 个子序列,一定可以完美匹配。
染色问题
题意: \(n \times m\) 的棋盘, \(c\) 种颜色。要求每行每列至少一个格子要染色,每种颜色至少出现一次,求方案数。
容斥一下,发现形如 \((-1)^i(^n_i)f(i)\) 的式子还可用二项式定理收起来, \(O(n^2 \log n)\) 。
子集
题意:求数列 \(\{a\}\) 所有子集中前 \(k\) 大的数和的和,对所有 \(i \in [1,n]\) 输出答案。
设从大到小排名为 \(i\) 的数字为 \(a_i\) ,所有子集中第 \(k\) 大的数的和是 \(c_k\) ,有:
\[c_k = \sum_{i=k}^{n} (^{i-1}_{k-1})2^{n-i}\]
可以得到一个 \(c_k=\sum_{i=k}^{n} f_i g_{i-k}\) 的式子,卷积。