2021 暑假萌萌 200 道
done
\(n^2\) 模拟对局之后用 upper_bound 加快查找顺序;
很有意思的一道
恶臭找规律题,+/- 相当于本身计算方法并且强制改变后面一个数,让它最高位 +1 为 ('+/-'-'0');
拆成两个一样的问题之后上背包即可;
标准数位 DP 型,拆成 \(\log\) 个格子之后暴力填,复杂度戳这;
注意到一堆乘法要用高精,不妨把它拆分多个素数,根据 \(\gcd\) 的
bug特性去写个单点修改维护 \(\min\) 动态开点的 \(\text{Segment-Tree}\) 即可;
倍增+并查集应用,具体就是拆成块长为 \(2^j\) 的块进行并查集路径压缩。
第一问模板,第二问具体分讨推一波。
神仙构造,设 \(\sum_{i=0}^{INF-1} f(i) \equiv p (\mod a)\),则有 \(\sum_{i=1}^{INF} f(i) \equiv p-f(0)+f(0+INF) \equiv p+1 (\mod a)\),类似可推得 \(\sum_{i=a-p}^{INF+a-p-1} f(i) \equiv 0 (\mod a)\),\(p\) 由定义递推出得 \(81 \times INF\) 后就珂以做了。
两道题一样,经典的树形 DP,设 \(f_{i, 0/1/2}\) 为用儿子的/用父亲的/用自己的 推一波即可。
完全不需要通项公式,转化一下即可,过程类似于 ksm 的思想连加。人生苦短,我用 Py
很明显有以下定理:
若三个点 \(u,x,v\) 满足 \(u \to x\) 有一条左括号边并且 \(x \to v\) 有一条右括号同类型边,那么这三个点构成一个合法路径;
显然楼上那个定理满足可并性;
直接上这是 l 这是 r 这些边我不加(小声),这些边我不加(震声),暴力怎么做?暴力是不是,加边!加边!加边!并查集查询,搞完之后普通计数。
新的直径只会在 \((u, v)\) \((u, s_1)\) \((u, s_2)\) \((v, s_1)\) \((v, s_2)\) \((s_1, s_2)\) 出现,直接上倍增即可。
标准拆位题,拆完之后上线段树,异或相当于区间取反。
比较仙,考虑每一种长度的结点的贡献,分讨,贡献分两种:
只存在单个区间内的,这个用记忆化
跨区间的,记 \(l_n\) \(r_n\) 分别为 \(1,n\) 的贡献,发现总贡献正好事 \(l_n \times len_{right} + r_n \times len_{left} - 1\),而 \(l_n=l_l+l_r+r-1\) \(r_n\) 同理。
枚举右端点,发现最大的 x 只增不减,直接暴力枚举一遍更新,复杂度 \(O(np)\)。
柿子转变为 \(d \times (n + \sum_{i=1}^{n} [\frac{a_i-1}{d}]) \le k + \sum_{i=1}^{n} a_{i} [\ ] \text{为向下取整}\),枚举 \([\ ]\) 内的东西套整除分块就珂以做了。
\(f_{i, S, c}\) 表示第 \(i\) 行为 \(S\),总共放 \(c\) 个的总方案数,\(f_{i, S, c}=\sum_{T \dagger S} f_{i-1, T, c-cnt[S]}\),\(T \dagger S\) 表示 \(T\) 与 \(S\) 互斥,简单 DP 即可。
考虑求其补集,不难想到珂以转化为 \([l+1, n-r]\) 的人一样,(注意有这个区间的人不超过区间长度),长度一样的转变为以个权值,这样问题变为:
给出多个带权值的区间,选出权值最大且无相交的几个区间
这是个简单的 trick,珂以 \(O(n\log n)\) 解决。
单向边取反集变为双向,问题变为分成两组互无连边的点集,直接 dfs 后 dp 即可。
不难想到各种钞票之间相互独立,设 \(f_{i, A, B,C}\) 为第 \(i\) 面值钞票,三人手上的金额,考虑用 \(f_{i-1, A, B, C}\) 去推 \(f_i\) 层的,由于不能枚举 \(f_i\) 的总状态,我们只要考虑 \(f_{i-1, A, B, C}\) 珂已转移到哪里,不难想到珂以枚举转移的钞票数量(注意珂以反向转移,因此枚举上限应该是 \(i\) 层的总钞票量),不难写出:
\[f_{i, \text{可转移的位置}}=\min{f_{i-1, A, B, C}+val} \]发现总金额一定,所以珂以丢掉第四维。
二分图充要条件为不存在奇环,那么所要找的边一定事删去后不存在奇环的边,因此可知它被所有奇环覆盖,且不能被偶环覆盖,简单树上差分即可。
简单 \(\text{2-Sat}\) 模板。
考虑到树内交换子树并不会对先序遍历中树外部分形成任何逆序对,即:每次交换都是独立的,类似于归并排序,我们考虑如何计算每次交换前和交换后的逆序对数量,逆序对数量无非三种情况:
- 二数都在左子区间内 2. 都在右子区间内 3. 跨区见
由于每次分叉需要合并两棵子树,不难想到使用线段树合并解决问题。
建反边上 dfs 即可。
发现一堆递减的数只有最后一个数有用,将其压成一个单调递增的数列,正着不好写考虑倒推。设 \(f_i\) 为结果序列是操作 \(i\) 后序列的多少倍,将 \(a_i\) 拆成 \(\left \lfloor \frac{a_i}{a_{i-1}} \right \rfloor + a_i \% a_{i-1}\),前者很容易做,后者二分即可,复杂度 \(O(n \log^2 n)\)。
简单 ssh 即可
直接插入一个当前最小数的两倍于此小数中的最大值即可,最终剩下的就是 ans。
内存没开大 WA 了 114514 发。
点数很少直接暴力连边,跑匈牙利算法即可。
简单 DP。
设 \(win_i, fail_i\) 分别为在 \(i\) 结点 胜利/失败 最少需要多少结点,显然输的时候需要全部子结点都赢,赢得时候只需要一个子节点输。计算完之后统计多少个结点正好需要需要一个子节点全输即可。
线段树暴力合并。\(Solution\)
转换题意后简单树剖。\(Solution\)
找出性质后 DP 即可。\(Solution\)
又是一个算法本质思维题,要求字典序最小,只要倒序跑匈牙利就能保证。(因为匈牙利匹配会修改前面的而不是当前的完)
35
暴力拆点后跑匈牙利即可,这输出格式有点怪。。。
显然安全的关系需要满足环内没有夫妻边,简单缩点即可。
最小点覆盖板子。
找到 0/1 要素后连边,最小点覆盖。
同上。
同上。
记录 \(f_{i}\) 为前 \(i\) 天的最小花费,暴力把在 \([l,r]\) 天都珂以行走的最短路,简单 DP 即可。
- K=0,显然每个边都要走两遍;
- K=1,直径上每一个点只走一遍显然最优;
- K=2,对于所有的情况,都珂以转化成直径+某一条链(虽然有些不能转化,但珂以对比出直径更优),因为重叠的边只计一次,把第一次直径上的边取 -1,再求一次直径,\(ans=2*(n-1)-(L1+1)-(L2+1)=2*n-L1-L2\)。
设 \(f_{l,r, x}\) 为是否能合并 \([l, r]\) 成字符 \(x\),暴力 DP 即可。
考虑如何推错排数,计 \(S_n\) 为方案数,显然第一个有 \(n-1\) 种选择,若第二个为一选的数则加上 \(S_{n-2}\),否则是 \(S_{n-1}\),即 \(S_n=(n-1)(S_{n-1}+S_{n-2})\)。
答案为 \(C_{n}^{m} \times S_{n-m}\)。
杨辉三角暴力,对 k 去 mod 为 0 即能整除,简单递推计数即可。
搬到序列上谁都会,既然需要求最前填 \(0/1\) 的值,并且最终值只有 \(0/1\) 暴力在线段树上维护数组 \(f[L/R][0/1]\) 表示填 最前面/最后面(因为在树上,所以要从两个方向记)为 \(0/1\) 得到的值。
考虑线段树上怎么合并,显然若 \(f_{k, L, 0}\) 为 1 只有两种可能:\((f_{ls, L, 0}=1\ \text{and} \ f_{rs, L, 1}=1)\) \(\text{or}\) \((f_{ls, L, 0}=0\ \text{and} \ f_{rs, L, 0}=1 )\) (因为你肯定是要 \(ls\) 最左值为 \(0\) 的,那么 \(f_{ls, L, 0}\) 对应值放到 \(rs\) 的下标找即可。)
这样做是 \(O(qk\log^2n)\) 的(会被卡常),在线段树上用一个
unsigned long long
压掉就能做到 \(O(q(k+\log^2n))\) 了。
设 \(f_{i, j}\) 为只利用前 \(i\) 个垃圾、时间为 \(j\) 所能到达的最大高度,暴力 DP 即可。
同 P4071
先假定一个点为初始点,以它为根向下拓展。
设 \(f_{x}\) 为以 \(x\) 为根的子树对答案的贡献,考虑它的儿子对其的贡献,肯定是儿子的子树拍成序列后插入之前的儿子形成的序列,即 \(C_{size[before]}^{size[v]}\)。
换根做 \(n\) 次加法原理,答案记得减半,因为一条边连到的两个点会算重。
我们枚举最大公约数 \(d\),\(d\) 多大才会有解?肯定是 \(\frac{d(d+1)}{2} \le n\) 才有(相当于 \(1-d\) 可行),这样 \(d\) 就在 \(\sqrt{n}\) 范围内了。
若 \(n= \prod_{i=1}^{m} p_i^{c_i}\) 则 \(p_i^{c_i-1}\) 一定可行(前提是 \(p_i^{c_i-1} \le \sqrt{n}\)),直接暴力除掉然后构造一个长度为 \(k\) 、严格递增及和为 \(\frac{n}{p_i^{c_i-1}}\) 的数列即可,注意首先满足公约数最大,注意枚举顺序。
线段树上哈希。
神仙构造。
将上一部影片的价值标负,并将上上部价值标零,问题转为全局最大连续子段和。
exgcd 板子。
垃圾单调性质题。
显然垃圾 DP。
按房子位置排序后,肯定会顺路把能收的收了,因此如果我抓完了区间 \([l, r]\) 内的精灵,我必然在端点处,设 \(f_{l, r,T, 0/1}\) 为在 \(T\) 时刻处理掉 \([l, r]\) 内的精灵且最后位于 左/右 端点的最大价值,简单 DP 即可。
\(v\times m^2=m\sum a_i^2-(\sum a_i)^2=m\sum(sum_i-sum_j)-S^2\),我们只需要让 \(\sum\) 内的东西尽量小,设 \(f_{i, j}\) 表示第 \(i\) 天走了 \(j\) 段则有 \(f_{i, j}=\min_{i-1 \le k <j} f_{i-1, k}+(sum_j-sum_k)^2\) 斜优板子。
60
发现答案与切割顺序无关后直接暴力 DP + 斜率优化即可。
边权为 \(1\) 那么 最短路 = 点数,对三个点分别跑最短路之后取 \(\min\) 。
\(\frac{1}{n}+\frac{1}{n+1}+\frac{1}{n(n+1)}=\frac{2}{n}\) 小学知识。
显然贪心胡乱分配即可。
\(ans=\max(a_{n-2}, a_n\%a_{n-1})\),注意离散化后特判。
交换相邻位置会 \(+2\),加到 \(2k\) 就好了。
只有 1 会影响结果,分讨后就是 nim 板子。
感觉都比较套路,T10 板子,T1 对于时间拆点,T2/5 对于爆炸问题新增一个新节点就能解决,T3 典型边转点,T4 对周期下手,T6/7/8/9 推出柿子后没难度,
扫描线板子,把每个矩形压成一条线算贡献。
为什么这玩意会有模板题》
莫队板子。
设 \(f_i\) 为选取前 \(i\) 个数需要的最多划分数,显然 \(f_i=\max_{j<i} f_{j-1}+1 \wedge \gcd(a_i,a_j)>1\),对于每一个质因子开权值线段树,珂以艹过去。
考虑性质后上 ST 表。
感人的数据范围。
比较经典的贪心构造。
ABC 日常被 CF 吊打(,显然对于每一条边按边权排序就能丢掉 \(\max \min\) 了。
没事做做莫反愉悦身心(
T4 虽然不是莫反但是莫反做熟了自然也会 l/d, r/d 了
T1 需要卡常,对质数连边后再优化建边跑二分图,T2 跑两个二分图(不知为啥被 hack 了,待研究)
因为上面正解是网络瘤就来学了(
大力找性质,不难发现可拆分成两个单调的序列,且前头最小值大于后面最大值,依照这个性质,设第二维为最小值,DP 即可。
- CF1270
\(\text A\) 简单贪心,\(\text B\) 没有要求最大且元素不同只要找相邻位置即可(因为如果一个个序列里的子序列必然是满足要求的),\(\text C\) 人类大智慧 \(2\times Xor= sum'+Xor'+Xor'+sum'\),\(\text D\) 是个小学奥数题,\(\text E\) 把点分类成 \((0, 0)(0, 1)(1, 0)(1, 1)\) 四类即可。
大眼观察操作二,发现本质上是对操作一的拆分,猜一手循环节为 \(a+1\) (因为 \((a-1)(a+1)=a^2-1\)),之后就是博弈论递归了,层数为 \(\log\)。
膜你赛题,做后缀异或值,关键点共 \(20\) 个,显然状压 DP。
考虑如何使得每一对路径都被找到,因为不同点编号 \(x,y\) 二进制下必然有一位不同,所以枚举每一位二进制分组跑最短路。
背包 DP + 长链剖分优化。
考虑每个节点的贡献,显然答案是 \(\sum \frac{1}{dep_i}\)。
到了边界就没用,所以二分期望,把边界都设成 \(mid\),剩下简单期望 DP。