孤举敬卿花间酒,没想到dp怎么办求救
day1
t2
改最少的等价为保留最多的不变
注意到 $ a_i,a_j $ 都不用改,当且仅当不一样的位数小于等于 $ i-j $
然后dp,做到 $ O(n^2) $
实际上只需要从前面 $ log(v) $ 转移即可,因为更前面的没有影响
做到 $ O(nlogv) $
t3
不经典套路脑筋急转弯题
设 $ calc(fir,d,las,k) $ 代表首项,公差,尾项,次数
设出这个可能就会了
或者插值
t4
不妨设答案为 $ f_i $
容易想到,求这个东西,只要任取 $ i $ 的约数即可
但是实际上求出来的是 $ g_i $ ,满足:
$ g_i = \sum_{j|i} f_i $
那么 $ f_i = g_i - \sum_{j|i,j \neq i} f_j $
随便推推狮子可得 $ g_i = (\sum_{j|i} a_j)^k $
我们发现 $ j < i $
从小到大枚举 $ i $ 即可计算 $ f_i $
二分
P11952
给的做法是 $ O(n^2 + qn) $ ,但容易优化到 $ O(n^2) $
分为两种
-
强制走这条边
-
强制不走这条边
对于第一种,正反预先dp出最短路,答案显然
对于第二种,转化为强制走互斥的边
边互斥,当且仅当左端点、右端点横、纵坐标四个值的和相等
预处理一下强制走每条边的最短路,可以$ O(1) $ 回答询问
P6733
二分答案 $ x $ ,要求的是有多少杯水温度 $ \ge x $
狮子是 $ a_i \times c_i + a_j \times c_j \ge x \times a_i + x \times a_i $
转化为 $ a_i \times (c_i - x) + a_j \times (c_j - x) \ge 0 $
把上边的东西记作 $ b_i,b_j $ ,排序后双指针或者二分就行了
$ O(nlognlogv) $
P2498
经典拯救byr公主
二分答案 $ x $ ,那么不能经过若干个圆
这个题比某个abc题简单
不能达到,分为四种情况,从左/上到右/下连起来了
注意到 $ n \le 3000 $
可以 $ O(n^2) $ 搞出来每个圆是否联通
记录每个连通块横纵坐标的最大最小值
看看是否符合上述四种情况之一即可
复杂度 $ O(n^2 \ log \ max(row,line)) $
P4857
二分出结束时最左边的人的位置 $ x $
则发出了 $ \sum \lceil x / a_i \rceil $ 条命令
$ >k $ 是不行的
$ =k $ 是刚好的
$ <k $ 是存在一些人留在 $ x $ 仍然需要走一步的,容易模拟
现在容易求出每个人最后的位置 $ b_i $ 了
接下来模拟
先将每个人放入小根堆中
将 $ b_i $ 从小到大(再让id从小到大)排序,每次让堆顶直接移动到 $ \ge b_i $ 的位置(如果堆顶id更小,需要再移动一步)
记录一下步数,输出答案即可
启发式合并
询问每个子树颜色数
只要把size最大的子树往上传递,暴力算其他子树即可
复杂度 $ O(nlogn) $ ,证明忘了
贪心
P4447
从小到大,优先放目前最少的组
按位与最长路
如题
从高位到低位判断
如果高位可以为1,那么把所有这一位不是1的边全删了,继续往下就行(dfs/bcj)
P9378
注意到这个权值很有意思,也就是说从前往后贪心,能选就选即可
考虑目前选的实验集合为 $ S $ ,判断一下合不合法
方法:按顺序枚举宇宙射线,再按顺序枚举该宇宙射线的实验,找到第一个不在S中且未摧毁的实验 $ k $
这就代表着它前面的实验(不包括已摧毁的和已完成的)必须在此之前完成,判断能否完成
如果能完成,那么直接摧毁 $ k $ 就好,因为它没有用
直到最后仍能完成,证明方案合法
不合法需要剔除这一次贪心选的实验继续向后贪心
总复杂度 $ O(n^2 m) $
agc023f
首先,优先选 $ 0 $ ,证明显然
就可以把所有 $ 0 $ 权节点合并给父亲
现在剩下了一些以 $ 1 $ 开头的需要合并给父亲,方案?
考虑两个节点 $ a,b $ ,拥有 $ a0,a1,b0,b1 $ 个 $ 0/1 $
只考虑两节点间的逆序对,两种方法分别为 $ a1 \times b0,a0 \times b1 $
所以只要把 $ num1/num0 $ 放进堆里面取就行了
光速幂
底数确定时,令 $ B = sqrt(v) $
预处理 $ a^{[1,B]} $ 和 $ a^{[1,B]\times B} $
可以做到 $ O(sqrt(v) \times q) $
根据 $ v,q $ 选择合适的 $ B $
作业
P1419
二分答案x,判断只需要减去x看有无长度符合条件且区间和非负即可
我用的是ST表,复杂度 $ O(n \ logn \ logv) $
P3017
别读错题
二分答案之后不随便做?难度应为黄
P8153
我是实在懒得写代码了
分类讨论4种,预处理串自身的对数,枚举开头是0还是1
当前是0,优先级为00,01,11,10
当前是1,优先级为11,10,00,01
P3845
又是一道绿评了蓝的题
离散化,按照x排序后,转化为最小链划分
等价于导弹拦截
P9144
P2048
P8341
uoj750
day 2
懒得写代码了,实在调不过啊
t2
连边, $ i <-> v_{i,1/2} + n $
如果无解,当且仅当某个点度数为0
先从度数为1的点开始,这类点确定唯一方案
剩下的都是环,每个环只有两个方案
分开处理即可
t3


t4

线段树
P6373
出息了,秒了一道蓝色线段树题
记录 "I" "O" "IO" "OI" "IOI" 的个数
容易做到单点修改,区间查询
day3
t1
合法区间一定是极大的,即 $ l $ 确定时, $ r $ 使得区间合法且 $ r + 1 $ 使得区间不合法,否则更劣
因为时间都是正的,故具有严格单调性,即对于 $ l_1 < l_2 $ ,保证 $ r_1 \le r_2 $
双指针,使用两个堆/可删堆/ $ multiset $ 模拟即可
t2
设 $ f_i $ 代表共有 $ i $ 个人时,我能认识所有人的方案
边界: $ f_1 = 1 $
@cancan123456 名言:遇到不会的计数题先容斥一波
那么 $ f_m $ 是不是就相当于总概率减去所有最终交际圈不到 $ m $ 的概率
考虑共有 $ i $ 个人最终交际圈有 $ j $ 个人的概率
$ C_{i - 1}^{j - 1} f_j $
乘上
$ (1 - p)^{i - j} (\sum_{o=0}^{k-1} C_{j - 1}^{o} p^{o} (1 - p)^{j - 1 - o})^{i - j} $
上面那一行指的是最终交际圈有 $ j $ 个人的概率,但这样算还不对
注意 $ f $ 的定义,和我们要求的有出入,因为这里还要求其余 $ i-j $ 个人不在交际圈里
也就是说它们不能直接认识我,也不能认识其他 $ j-1 $ 个人中的 $ \ge k $ 个,这就是下面一行表示的
最终公式:
$ f_i = 1 - \sum_{j=1}^{i-1} C_{i - 1}^{j - 1} f_j (1 - p)^{i - j} (\sum_{o=0}^{k-1} C_{j - 1}^{o} p^{o} (1 - p)^{j - 1 - o})^{i - j} $
做到了 $ O(n^3) $
容易发现,上面公式中的 $ \sum_{o=0}^{k-1} C_{j - 1}^{o} p^{o} (1 - p)^{j - 1 - o} $ 一部分与 $ i $ 无关,可以 $ O(n^2) $ 预处理这一部分的值,实现 $ O(n^2) $ 转移
最终复杂度:小常数 $ O(n^2) $ ,可以通过此题
t3
先考虑一定进行操作的情况
这个 $ 1,2 $ 操作不大好做,怎么办?
我们发现 $ 1,2 $ 操作在值域上是一段连续的区间,这提醒我们把它放到值域上做
进行第一次转化,操作 $ 1,2 $ 等价于将值域的某段 前缀或后缀 后移或前移 一格,并把重叠的单点移到空缺的位置上
$ 3 $ 操作比较简单,仍然是交换两个值的位置
$ 4 $ 又不好做了,在值域上不是连续区间啊?
进行第二次转化,我们设 $ f_{i,j} $ 代表 $ [a_i > a_j] $ (括号为艾德曼括号)
那么询问转化为 $ (r - l + 1) + \sum_{i=l}^{r} \sum_{j=1}^{n} f_{i,j} $
继续观察,每次操作只会改变一个值与其他值的偏序关系,而前缀或后缀之内的相对偏序关系是不变的
同时我们维护 $ g_i = \sum_{j=1}^{n} f_{i,j} $ ,这个还是比较好维护的
如果加上不操作的情况,把这个东西套上概率维护就行了
做到了 $ O(nm) $ ,可能不能通过,继续优化
注意到操作数较小,总的被操作(包括4)过的单点只有 $ \le 2m $ 个,可以把其它的整块视为一个点,相应地维护 $ f,g $
最终复杂度 $ O(m^2) $
t4
看到回文串就开始划分等价类了

动规
本质:视为 $ G = (V,E) $ ,$ V $ 为状态集, $ E $ 为转移集, $ G $ 为一个 $ DAG $
day4
t1
- 容易理解的 $ O(nlogn + nlogv) $
二分答案 $ x $
$ check $ 时,看起来要枚举每个长度为 $ x $ 的值域区间,但是值域很大
注意到只有左右端点至少一个可以得到的区间才是有用的,可以只枚举这 $ \le 2n $ 个区间
如何计数?二分是容易想的。
注意到还有重复计数的情况,需要去重,比较简单
此时 $ O(nlognlogv) $ ,放在任何一台正常的电脑上都能过,但是被卡常了!!!
其实只需要换成双指针就行了
实现单 $ log $
- 不容易理解的 $ O(nlogn) $
排序后, $ O(n) $ 扫一遍,那么操作是对一个前缀去做,枚举断点即可
t2
转化为合法二分图最多能加几条边
转化为最大化 $ num_{thu} \times num_{pku} $
转化为最小化 $ abs(num_{thu} - num_{pku}) $
我们先不考虑已经确定的连通块
对于每个不确定的连通块,其单独的差只有两种情况
注意到 $ n \le 1000 $ ,可以设 $ dp_{i,j} $ 代表前 $ i $ 个连通块,差为 $ j $ 可不可行
复杂度 $ O(n^2) $
t3
甚至想出正解了,可惜没调完
先考虑 $ k = 0 $ 且 $ L,R $ 位数相等
我们把暴力的伪代码写出来,数列递推,容易想到矩阵快速幂
对于 $ L,R $ 位数不相等,把位数相等的分段考虑就行了
对于删除操作,记录一下删了那些,分段考虑就行了(每次只应重新计算 $ 1 $ 或 $ 2 $ 段)
感觉不需要线段树,但还是说一下
先离线出所有区间
每次删除相当于把矩阵改一下,如下
| ans | i | 1 |
|---|
| $ 10^k $ -> 1 | 0 | 0 |
|---|---|---|
| 1 -> 0 | 1 | 0 |
| 0 | 1 | 1 |
t4
线段树
二分图
二分图的最大独立集 = 二分图的总点数 - 二分图的最大匹配 = 补图的最大团
day5
t1
这里只证明这是错题
先看数据
13
1 2 3 4 5 6 1 2 7 8 9 2 3
答案显然为 $ 1 $ ,可以只改第二位,但是 $ std $ 答案为 $ 2 $ ,修改了 $ 8,13 $
也就是说,同样的字串,修改不同的位置对其它字串的影响,是没有确定顺序的,不能钦定改两个子串的最后位置是不劣的
银牌爷syz说“是不是没法做”
t2
不如先考虑斐波那契数列的循环节 $ l $
打表可知 $ l < km $ ,其中 $ k $ 为常数且 $ k < 10 $
那么对于前两项改变了的循环节 $ ll $ ,一定满足 $ ll|l $ ,否则不能满足长为 $ l $ 的循环
那么转化为已知长度已知前两项判断 $ l,l+1 $ 项是否和 $ 0,1 $ 项相等,矩阵快速幂即可
每次硬跑矩阵快速幂会T,预处理即可
t3
正难则反
我们要求的是形似 $ 3 1 2 $ 的方案数
转化为 $ (312 + 321) - 321 = 3?? - 321 $
遇到所有子区间求和,考虑分治(就像树上所有路径考虑淀粉质)

t4
某坨坨的神秘计算几何题
有用的:
- 已知点坐标三角形面积的叉积求法
已知三个点坐标为 $ (a1,b1),(a2,b2),(a3,b3) $
则两个向量为 $ (x1 = a2 - a1,y1 = b2 - b1),(x2 = a3 - a1,y2 = b3 - b1) $
三角形面积 $ S = \frac{|x1y2 - x2y1|}{2} $
没想懂这东西和右手螺旋定则有啥关系
- 判断一个点是否在凸包中的做法
以这个点向凸包上每对相邻点对连边,构成三角形,求出这若干个三角形的总面积,与凸包面积比较,相等就是在凸包内
- 闵可夫斯基和合并凸包
不知道怎么实现
hash
-
O(n)预处理 O(1)比较两个字符串是否相同
-
O(n)预处理 O(logn)比较两个字符串字典序
预处理前缀哈希值,二分第一位不一样的即可
哈希的一些条件
-
模数约为 $ 10^9 $
-
不要用常见的大质数
-
双哈希
-
不要用自然溢出
day 6
t1
设 $ i $ 走到 $ n $ 的期望距离(不知道边权)为 $ f_i $
那么一定选 $ d + f_e $ 最小的走
可以做到 $ O(n \times 2^{deg}) $
注意到只有 $ 2deg $ 种情况,可以放一起排个序
考虑每种方案被选择的概率:当且仅当前面的方案均不成立
当某条边出现了两次,不能使得他们均不成立,停止循环
t2
推狮子,令散射次数 $ j = pk + q $ ,可以推出一个关于 $ j $ 的花费的狮子
把 $ pk + q $ 代进去,发现和 $ k = 1 $ 的狮子同构,可以用一样的求法
然后枚举 $ q $ (注意到只枚举其中 $ n $ 个),维护分界点(哪些AOE掉,哪些点掉)即可
t3
把所有空地和四个方向连边,将每个出口与超级汇点连边,点双建出圆方树
一个车合法当且仅当其相邻的四个点至少一个与汇点相邻
那么只需要搞出路径交(LCA->汇点),简单容斥一下即可
t4
你知道了树上点对转化为数轴上区间,那就可以把两条树上的点对转化为矩阵
形成了一棵树,dfn转为区间 $ x_i + 1 $ , $ b_i + w $ , $ k_i \times x_i + b_i $ 最大值
维护在什么时候最大值更新了,此处不知道咋维护
更新了就暴力重构,复杂度真对吗,讲的是 $ O(nlog^2n) - O(nlog^3n) $
数学
gcd,exgcd,lucas,费马小,欧拉,crt,excrt,威尔逊
浙公网安备 33010602011771号