EZOJ 刷题笔记(1)

EZOJ65 A

AC code

pi=i 时强制让 pipi+1 交换,这样交换显然是对的并且是最优的。

注意当 i=n 时也要这么做因为你可以找到一个 pi(1i<n)pn 交换。

时间复杂度为 O(n)

EZOJ20 ymh喜欢函数

AC code

二分神题,最优选择的答案一定是一个下凸函数,所以先特判掉 t=0 的情况是否可行,然后再二分求 t 即可。

t=0 时答案小于 S,则函数单调下降的部分小于 S,二分的区间一定会缩小到函数单调上升的部分,故二分是正确的。

注意出题人卡了 log2 做法,找前 k 大时不能用 sort 要用 nth_element,注意 ikit+bi 可能会爆 long long。

这道题实际上数据保证了 t[0,109] 范围内必定有解但是并没有说……

时间复杂度为 O(nlogV)

EZOJ22 ymh的序列

咕咕咕~

EZOJ45 SKY_magician的完全图

AC code

fi,j 表示 i 个点的完全图划分成 j 个连通块的方案数,gi 表示 i 个点的完全图删若干条边的方案数,则有:

fi,j=k=1i1(i1k1)×fk,1×fik,j1(j2)

gi=2i×(i1)2

fi,1=gij=1i1(i1j1)×fj,1×gij

上述状态转移方程并不难理解,提示:为防止重复计算方案,选取一个关键点,并选择其他一些点连向该关键点构成一个连通块。

最终的答案即为 fn,m,注意到题目要求至少删一条边,所以 m=1 时要将一条边都不删的情况给减去。

时间复杂度为 O(n3)

EZOJ50 SKY_magician的集合

AC code1

AC code2

注意到 ai 最大才只有 106 也就是说枚举因子 O(VlogV) 是能过的。 

设集合中有 cnti 个数是 i 的倍数,则答案很显然是 i[jiij,cnticntj]

因为只要存在一个不满足该条件的 j,则 j 就可能成为某几对数的最大公因数,i 就一点都不可能了。 

AC code1 是我一开始写比较暴力的 O(nlogn+nV+VlogV),但是由于 nV 比较小就冲过去了。

AC code2 是此题的正解,时间复杂度为 O(n+VlogV)

EZOJ127 SKY_magician的qwq

AC code1

AC code2

把 w 看成 0,把 q 看成 1,问题等价于求长度为 n 的 01 序列满足任意两个 1 中间至少有 k0 的个数。

这个问题就很简单了,可以考虑 DP 也可以考虑组合数去计算。

fi 表示考虑前 i 位且第 i 位是 1 的合法 01 序列方案数,则有:

fi=1(0ik)

fi=j=0ik1fj

上面的那个 显然可以记录前缀和来优化掉,AC code1 是这种做法,时间复杂度为 O(n)

或者我们也可以把它看成组合数问题,至少有 k0 在两个 1 中间,那么就可以把这些 0 都删去。

所以我们可以枚举有 i1,原问题就相当于在 n(i1)k 个位置里面放 i1 的方案数,即为:

i=0m(nik+ki),其中 m=n+kk+1 表示 i 的上界(由 n(i1)ki0 推导得到)。

注意模数 5000011 是个质数,可提前预处理出阶乘及其逆元,AC code2 是这种做法,时间复杂度为 O(n)

EZOJ51 黎曼函数

AC code

按照题意模拟,预处理出 f(x)k 阶导函数即可。

注意模数是 108+7 不是 109+7

时间复杂度为 O(kn+qn)

EZOJ52 树状数组套splay

AC code1

AC code2

离线做法很简单,将边权和询问都从大到小排序后,向图中不断加边,用并查集维护当前图中的连通块数即可。

如果强制在线呢?也不难想到选择边权尽量大的边答案一定不劣,所以直接 kruskal 找出最大生成树,保证能让最小的边的边权尽量大,然后对于每次询问二分出最多能用多少条边即可。

注意题目中没有保证图连通,这里所说的最大生成树不一定是连通的,所以设二分出能用 k 条边,答案应为 nk,与最大生成树的边数无关,然而 std 的柿子与边数有关便挂了,这里给出一组 hack 数据:

4 2 1
1 2 1
2 3 2
1

答案应该是 2,输出 1 的是错的。

但是我发现出题人造的数据都是一棵树,所以也有可能数据保证图连通但是出题人没有写在题面上?

数据范围说好的 n105,不知道为啥出题人造的数据 n 最大才 104,导致在线做法跑得要比离线的快一些。

AC code1 是离线算法,时间复杂度为 O(mlogm+qlogq+mα(n))

AC code2 是在线算法,时间复杂度为 O(mlogm+qlogn+nα(n))

EZOJ53 SG函数

AC code

首先 (nm) 显然比 (n1m) 要大,所以我们可以维护一个堆,每次贪心选最大的组合数。

现在难点在于如何比较两个组合数的真实大小,由于数字巨大没法存储真实数字,取模意义下显然也不对,所以可以考虑取对数:

log(nm)=logn!m!(nm)!=logn!logm!log(nm)!

logn!=i=1nlogi,所以我们存储 log 函数的前缀和即可,膜意义下的组合数可以提前预处理出阶乘及其逆元。

注意 log 要用浮点数存,需要 cmath 库里面的 log 函数。

虽然我用 pb_ds 的配对堆,ext/pb_ds/priority_queue.hpp 库包含了 cmath 库,但是还是建议用 log 函数就开 cmath 库。

时间复杂度为 O((n+k)log(n+k))

EZOJ57 主席树优化最小割

AC code

一开始打表发现了答案是斐波那契数列,直接矩阵快速幂求解即可,现在来证明一下:

x3x=2x 即为 x2x=3x,而 x+2x=3x 也成立,显然只有当 x+2x 不进位时两个柿子才同时成立。

考虑到 2x 就是 x1,所以 x+2x 进位当且仅当 x 在二进制表示下有相邻的 1

于是就可以设 fi,0/1 表示没有相邻的 1 且最后一位是 0/1i 位二进制数,则有:

fi,0=fi1,0+fi1,1

fi,1=fi1,0

然后我们把第二个柿子变成 fi1,1=fi2,0 并将其带入到第一个柿子中,省略掉第二维,可以得到:fi=fi1+fi2

这也就是斐波那契数列的柿子,证毕。

时间复杂度为 O(logn)

posted @   jhqqwq  阅读(162)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示