孤举敬卿花间酒,没想到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

db9a03729570816c019ec87bc3b93f2c

d060f7016c90d0f3b73b8326f72f6fde

t4

f64e4058b2a9b92959b52828f8bed2fe

线段树

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

看到回文串就开始划分等价类了

image

动规

本质:视为 $ 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 $

遇到所有子区间求和,考虑分治(就像树上所有路径考虑淀粉质)

image

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,威尔逊

posted @ 2025-07-23 16:44  Minecraft_lb  阅读(21)  评论(1)    收藏  举报