11.09 杂题
CF 1578L
发现肯定是先满足权值小的边,所以直接按照 \(Kruscal\) 树的思想 \(dp\).
设 \(f_s\) 为吃掉 \(s\) 集合内糖果至少需要多瘦.
CF 1578A
模拟,考虑倒着做.
CF 1575M
和之前的「天使玩偶」用了一样的做法,分别做四遍从而简化问题.
斜率优化,和之前的「洛希极限」有一点像,不过这个貌似更简单了.
于是就做完了.
CF 1575B
显然的性质:满足要求的点一定在以原点为圆心的圆上,并且在被包含的 \(k\) 个点的圆内.
发现只有原点比较特殊,于是在以原点为圆心的圆上的弧上差分就好了.
CF 258D
似乎有一句话叫做'期望线性性'加起来得到的就是答案..?
所以考虑本题中什么是值得线性拆开的,那就是每两个位置上是否形成了逆序对关系.
每两个位置的贡献都是 \(1\),所以概率加起来就是期望.
然后 \(dp\) 无脑转移就可了.
CF 311C
看起来很同余,因为操作一中的 \(x\) 再大其实也没有卵用,都可以被一个 \(x%k\) 和 \(k\) 代替.
发现最多增加 \(20\) 次,于是 \(O(20*n)\) 的复杂度可以写.
于是每次操作一之后暴力更新就好了.
CF 317E
有一个叫做 芝诺悖论 的东西,可以形象地把那个影子看成乌龟..
每次向影子的方向前进一定不会劣,证明不会.
CF 325E
\(n\) 为奇数时无解,比较显然.
显然地发现 \(x\) 和 \(x+\frac{n}{2}\) 完全等价.
于是问题就变成了,\(1\) ~ \(n-1\) 每个点有两个出度,每个点有两个入度,且每个点都有一个点和自己等价,问能不能只选择其中一些边使得图变成一个环.
首先考虑能否得到一个环,然后考虑如何得到构造方案.
首先让每个和自己等价的点连向不同的点,可能会得到很多个环,发现只要交换一下就可以让环合并.
于是就做完了.
CF 338E
首先考虑如果 \(len_a==len_b\) 的时候,可以直接 \(O(len)\) 暴力匹配.
每次让 \(a_i\) 贪心选择最大的 \(b\),如果选不了,那么一定无解.
如果不相等的话,每次枚举起点,复杂度可以到达 \(O(len*(n-len))\) .
考虑如何利用之前匹配的局面.
发现每次变化的就只有一个 \(a\),于是线段树维护直接前缀和最小值就可以.
另外可以简单的转化一下.
由于我们求 \(a+b\ge lmt\),于是可以把每个 \(b\) 都变成 \(lmt-b\),问题变成了让 \(a\ge b\).
CF286D Tourists
这道题不会,因为题意太难..
但是从题解区里面学到了一个东西,就是笛卡尔坐标系是可以随便乱玩的.
从 \((x,y)\) 到 \((x-y,y)\),从 \((x,y)\) 到\((x-y,x+y)\) 的随意转化.
CF 1578J Just Kingdom
从上往下确实是很难考虑的,不如从下往上统计.
既然是从下往上统计,所以可以先考虑叶子节点在父亲下发了多少权值之后才能把自己填饱.
就是 \(x+\sum\limits_v min(needs_v,x)\),\(v\) 代表 \(x\) 的兄弟节点.
当某个点不是叶子的时候,如果儿子们被填满了,自己就是叶子了,于是自己的 \(needs_u\) 可以设为 \(val_u+\sum\limits_vneeds_v\).
考虑怎么统计这个 \(needs\),不知所措的时候可以考虑倍增优化.
发现 \(x+\sum\limits_v min(needs_v,x)\) 这个东西很容易就呈指数级增长,那么最多增长 \(log_2(\sum_{m_i})\) 次.
有点像树剖,于是类比着维护就可以了.
CF 1558F Strange Sort
一个常见的用法,这种排序可以选择每次钦定一个分界点\(w\),将 \(\ge w\) 的值设成 \(1\),将 \(< w\) 的值设成 \(0\).
于是问题变成了求这个 \(01\) 序列排好序至少需要多少次.
针对所有分界点所形成的所有 \(01\) 序列的排序次数最大值就是答案.
具体可以理解为将 \(w\) 排在\(\forall x\ (x<w)\) 的前面至少需要多少次,所以取个 \(max\) 就是答案了.
所以我们需要维护出每个 \(01\) 序列排好序的次数.
假设我们已知了一个 \(01\) 序列,一步一步做,想办法在 \(O(n)\) 时间内求出所有操作数.
仔细观察,其实只要最右边的 \(0\) 到了自己应该到的位置就可以了,所以只需要算出最右边 \(0\) 挪到自己位置的操作数.
这个东西还是比较简单.
假设最右边的 \(0\) 在 \(x\) 位置,第一眼感觉 \(o_x+[x\ mod\ 2]\) 就是答案,其中 \(o_x\) 代表 \(x\) 左边 \(1\) 的个数.
但是发现可能会有 \(0\) 挡在 \(x\) 位置的 \(0\) 前面,于是还要和上一个 \(0\) 的答案 \(+1\) 取一个 \(max\).
即:假设 \(s_i\) 表示第 \(i\) 个 \(0\) 挪到 \(i\) 位置的步数,那么 \(s_i=max\{s_{i-1}+1,o_{p(i)}+[p(i)\ mod\ 2]\}\),\(p(i)\) 代表第 \(i\) 个 \(0\) 的位置.
于是我们每得到一个新的 \(01\) 序列就需要 \(O(n)\) 计算,所以总复杂度为 \(O(n^2)\).
考虑如何优化,依旧是想办法能够利用起来之前的计算.
我们发现我们只关心 \(s_m\) 的值,而 \(s_m=\max\limits_{i=1}^{i\le m}\{o_{p(i)}+(m-i)+[p(i)\ mod\ 2]\}\).
发现序列中每次 \(0\) 的个数只会增加 \(1\),于是后面的东西就可以 \(O(nlogn)\) 线段树维护了.
不过这个东西貌似还可以转化,但是没懂,不过复杂度没变.
CF1552G A Serious Referee
看起来像是和上一题一个套路,于是就放一起了.
同样是将问题转化为 \(01\) 序列,然后一个剪枝就行了.