5、6月记录

https://www.luogu.com/article/bvovtmzp

希望能补上的:

https://www.cnblogs.com/xiaoziyao/p/17533907.html 浅谈集合划分容斥

https://www.cnblogs.com/alex-wei/p/set_power_series.html 集合幂级数相关

生成函数之类的。

76.CF1967 Codeforces Round 942 (Div. 1)

CF1967A

CF1967B1

b×gcd(a,b)|a+bqi2|(p+q)iqi|(p+q)q|pb|a

反过来也能推到。

CF1967B2

a+b|b×gcd(a,b)(p+q)i|qi2(p+q)|qi(p+q)|i

枚举 p,q,因为 p<i,pi<n,所以 p2<nq 同理。

容易做。

CF1967C

一个树状数组的结构。

相当于 k 次前缀和下的组合系数。

用树状数组模拟求出 a1ai1,乘上对应系数可以求出 ai

CF1967D

image

CF1967E1

经典双直线 O(nn)

77.CF1965

78.CF1969

CF1969E

记录每个点上的数前一个出现和后一个出现的位置。

合法区间是 n 个二维矩阵。

扫描线求出 li 表示以 i 为右端点,最大的不合法左端点。

按照 li 排序,最大的 li 一定要修改(必要性),记已经修改过的 min(li)mn,若之后的 li,有 imn,则跳过,一定最优。

79.CF335E

考虑知道 BA

对于一个高度为 i 的楼房,概率为 12i,高度 i 的概率为 12i1,小于的概率即为 112i1

考虑从一栋楼的第 i 层出发的通道的期望长度(除去最左点),则有:

pk=0+(1p)k(k+1)=1p=2i1

得到对于 B 的贡献也是 2i1,所以 A=B

注意,这里只能推出 B 走第 i 层的通道对 A 的贡献。

再考虑知 AB

这里就不同了,因为 A 对每一层不同的分配数量对 B 的贡献都有一个不同系数。

考虑从低往上考虑,不断将最大值限制提高。

设当前高度为 x,长度为 j,则有:

(nj)P(x)2P(<x)j1(2i12i2(1+k=0j1kP(=x)kP(<x)k))

再加上高度为 1n

时间复杂度 O(nm),好像可以矩阵优化。

80.CF1612F

fi,j 表示时刻 i,手中最大盔甲为 j 时最大的武器。

时间复杂度 O(ansn)

分析知,anslogn+mn

81.CF1866E

设某两天使用一台电梯,中途肯定在花费最小的地方行驶。

故记录三个电梯最近使用的时间即可,时间复杂度 O(q3)

82.CF1601E

image

83.P7470 [NOI Online 2021 提高组] 岛屿探险

image

84.P6846 [CEOI2019] Amusement Park

DAG 定向方案数,枚举独立集子集容斥。

容斥系数还有子集反演这种理解方法。https://www.cnblogs.com/Pbriqwq/p/15429971.html#_label2

85.AT_abc306_h

独立集中可以有边,因为有等号,故容斥系数改为 (1)+1

86.UOJ #37. [清华集训 2014] 主旋律

fS 表示形成强联通分量的方案数。

考虑容斥计算不形成强联通分量的方案数。

枚举入度为 0 的子集(缩点后),即其对应的原图的点集,然后容斥。

fS=2e(S)TSk=1|T|(1)k+1gk,T2e(T,ST)+e(ST)

T=S 时,k>1

uS=k=1|S|(1)kgk,S

fS=2e(S)+TSuT2e(T,ST)+e(ST)

考虑 uS,当 k=1 时,系数为 fS,否则我们(定顺序)枚举包含最后一点 v 的强联通分量 C,有:

uS=fSvCfCuSC

|S|=1 时,uS=1

要注意上面两个式子看似有循环定义,其实不然。

因为转移 fS 时如果 T=Sk1,因此可以先处理 k>1 时的部分 uS,再转移到 fS,最后再转移回 uS

87.UVA1489

若有一个数没有卡到上界,那么后面的位一定能够异或得到 k

每个数有上界,求异或和为 k 的方案数。

考虑枚举第 i 位,前面大的位每个数都卡着上界,当前位从小到大第 j 个数不再卡着上界,而编号 >j 的数当前位随便选。

fk,0/1 表示 jk 的数的异或和为 0/1 的方案数。

然后除了 j 这个数的其他数后面小的位随便选。

88.CF1874E Jellyfish and Hack

拉格朗日插值倒推系数。

89.P10221 [省选联考 2024] 重塑时光

真的能重塑时光吗?

考虑枚举形成了 i 段非空子集合,计算出方案数(集合去重)乘上对应的系数:

i!k!(k+1i)(n+k)!

我们要统计的是子序列的方案数,计数的部分有两方面要考虑:

  • 对于每个子集合,其序列为其导出子 DAG 的一个拓扑序。

  • 每个子集看作一个点形成的大图是一个 DAG

fS,i 表示集合 S,分成 i 个非空子集合的方案数(带上子序列方案数),gS,i 表示集合 S,分成 i 个非空的互不关联的子集合的方案数(带上子集合拓扑序方案数),hS 表示集合 S,导出的 DAG 的拓扑序方案数。

fS,i=TS[|e(ST,T)|=0]j=1ifST,ijgT,j(1)j+1gS,i=log2(lowbit(S))T,TS[|e(T,ST)|=0][|e(ST,T)|=0]hTgST,i1hS=vS[|e(v,Sv)|=0]hSv

https://zhuanlan.zhihu.com/p/559453837

e(A,B) 表示集合 A 连向集合 B 的边集合。

fO(3nn2)

发现 f 后面的转移可以卷积,且次数不超过 n,具体来说,将 f,g 用生成函数形式表示。

x=1n+1 带入,求出 FU 的取值。

FS(x)=TS[|e(ST,T)|=0]FST(x)gT(x)

这样做的好处是数组卷积变成了单个数相乘,时间复杂度为 O(n3n)

根据拉格朗日插值:

f(x)=i=1nyijixxixixj

对于每个 i,右边乘式的分母容易求出,分子可以暴力多项式乘法 O(n2) 预处理总乘积,然后运用大除法(因为 ji),这部分复杂度为 O(n2)

总复杂度为 O(3n+n2n)

鞅与停时定理复习

image

https://www.cnblogs.com/zltzlt-blog/p/18035649

90.AT_abc304_h

区间拓扑序贪心。

还原 l,r,然后,有一个显然的贪心思路:根据 r 从小到大考虑每个点,使每个点的拓扑序在满足要求的前提下尽可能小。

91.费用提前计算一类思想的总结

当前决策对未来行动的费用影响只与当前决策有关,过去考虑现在,过去计算现在的影响

  • 选择一个决策会带来一个对未来的代价,但又不能通过在状态中再增加一维记录代价满足需求。这个代价是必然的,无论后面如何选择,都不会改变这个决策所带来的影响,这就是当前决策对未来行动的费用影响只与当前决策有关,我们可以把这个代价看作决策本身的费用,将未来的代价提前计算出来,在决策的时候就计算上它将会带来的代价,通过状态向后传递。

P2365 任务安排

P1220 关路灯

[ARC126D] Pure Straight

CF441E

方法一

加法操作对一个数最大的影响是 +n

对于后 p 位截断,2p>n,加法操作对前面位的影响只有平移和至多一次 +1

fi,j,k 表示 i 次操作后,最低 p 位为 k,的概率。

k=0j 就表示 lowbit 是几。

否则,j 表示高位末尾几个连续的 1

方法二

加法导致的进位只会影响到前面的位,而对于(未来产生的)后面的位没有影响

考虑从后往前倒着做,设 fi,j,k 表示末尾进行了 i 次操作,是 j 次加法,然后是 k 次乘法的概率。

如果前面来个一个加法,则 jj+1

否则:

  • j 为偶数,可以试做 j/2 个加法,kk+1
  • 否则,不管怎样,最低的 1 是不会改变的,直接贡献答案

费用提前计算,答案为:

i=0n1j=0jmod2=0ifi,jp+i=0kfk,isumx+i

cin>>x>>k>>p,p/=100,f[0][0]=1.0;
for(int i=0;i<k;++i) for(int j=0;j<=i;++j) if(f[i][j])
{
	if(!(j&1)) f[i+1][j/2]+=f[i][j]*p,ans+=f[i][j]*p*1ll; //这里为了方便理解,因为权值为1
	f[i+1][j+1]+=f[i][j]*(1-p);
}
for(int i=0;i<=k;++i) ans+=__build_ctz(x+i)*f[k][i];
cout<<fixed<<setprecision(9)<<ans<<'\n';

方法三

预支加法操作。

fi,j 表示操作了 i 次之后的 x,再加上 j 之后末尾 0 的期望个数。

  • 这一步是乘法,那么 x 是偶数,如果 j 是奇数,末尾就没有 0,否则是 fi1,j2+1,算上概率。
  • 这一步是加法,为 fi1,j+1,算上概率。

[ARC126D]

image

当前决策对未来的贡献与未来有关,现在考虑未来的,现在计算未来的影响

  • 如果在当前决策把未来可能出现的情况提前计算好,通过状态传递到了未来,那到了未来是不是能直接把这个决策拿来用,是不是就能够进行转移了呢?

UVA10559 方块消除 Blocks

image

image

  • 回顾这个问题,我们起初想使用费用提前计算,把每次对未来的贡献摊在当前自己身上。可是发现未来的决策并不只于当前决策有关,还与未来本身状态相关。于是又开了一维状态,将目光放长远,预测未来可能出现的状况并计算,记录在状态中传递到未来,并在未来直接使用,这依然是一类费用提前计算的问题。

P3354 [IOI2005] Riv 河流

image

P2053 [SCOI2007] 修车

image

92.[ARC132E] Paw

归纳证明一段不改变,左边是 <,右边是 >

这下只需要统计概率。

image

93.[AGC012D] Colorful Balls

94.[AGC007D] Shik and Game

image

95.CF335F

96.CF1973 Codeforces Round 945 (Div. 2)

D

发现 m 是最大值的倍数。

先问 ? 1 ni,其中 1in,当得到回答是 n 时,可知最大值。

每次可以 k 次询问探求 m 的可能值。

每一段长度至少为 mmx,共 k 段,则 kmmxn,有 mmxnk

这样查询次数就 2n 了。

E

l=r,则答案为所有 ipi 的个数。

找到 ipi 的最小最大 i,为 L,R

必要条件是。

image

F

发现 gcd(A)a1 因子,gcd(B)b1 因子,还有翻转的情况。

D(k) 表示 k 的最多因子个数,P(k) 表示此类数所能有的最多质因子个数。

D(109) 约为 1000 个。

fx,y 表示 x|gcd(A),y|gcd(B) 的情况下满足的 ai,bi 个数。

gx,y 表示 x|gcd(A),y|gcd(B) 的情况下最小花费。

对于 ai,bi

  • 对于 x|ai,y|bi 的,fgcd(a1,ai),gcd(b1,bi)1ggcd(a1,ai),gcd(b1,bi)0

  • 对于 x|bi,y|ai 的,fgcd(a1,bi),gcd(b1,ai)1ggcd(a1,bi),gcd(b1,ai)ci

  • 对于上面两种情况都满足的,显然选第一种,fgcd(a1,ai,bi),gcd(b1,bi,ai)1ggcd(a1,ai,bi),gcd(b1,bi,ai)ci

做完后,对 x 进行后缀狄利克雷差分,对 y 也进行一次,时间复杂度 O(D2(k)P(k)),打出来不是很大,这样就有了 gcd(Ai)=x,gcd(Bi)=y

对于单次询问,二分答案,可以做到 O(D(k)logk)

多次询问就整体二分。

97.AtCoder Regular Contest 177

https://www.cnblogs.com/maniubi/p/18192439

https://drive.google.com/file/d/1J2x8pIYQ3MXANgvzOgBciWd3d79j_Exa/view

98.[AGC057C] Increment or Xor

image

image

image

99. AGC001

E

F

100. AGC002

D

E

F

image

101. AGC003

D

E

image

F

要么上下左右都有,要么都没有,要么只有一者有。

前两种方案容易计算。

image

102. AGC047

C

原根的性质。

image

D

考虑 LCA

image

E

先得到一个 1,再求出一个位置的值的二进制,然后模拟二进制乘法。

image

image

F

啊啊啊,怎么都是盒图片。

神题!!!

每个时刻可以移动的范围一定是二维平面上一个矩形,并且每次扩展只能在矩形的角上扩展。

对于一个起点的问题,有时向左下向右上都行,将极限状态加入,压缩状态至 O(n)

对于一个极长的相邻两个位置差为 1 的连续段,中间的所有点第一次扩展都是扩展到这个连续段,我们可以之后将每个连续段整体扩展。

分析一下,如果从小于 i 的位置开始扩展能扩展到第 i 段,则从第 i 段开始无法进行扩展。

证明:不妨设扩展到第 i 段时为向右上,这样第 i 段一定递增。如果从第 i 段开始时第一步能向左扩展,则左侧一段也是递增且该段的值域正好在第 i 段值域之下,此时这两段可以合并,矛盾。因此从第 i 段出发只能向右。而值为第 i 段值域下界减一的元素在这一段左侧(从左侧出发可以向右上扩展到这一段),因此从第 i 段向右不能向右下,只能向右上。而如果可以向右上扩展,则说明下一段为递增且下一段值域下界为这一段值域上界加一,此时这两段又可以合并,矛盾。因此从这一段开始无法进行扩展。

这样多扩展一段会关闭一个段的扩展,考虑一些极大的区间,。。。

然后一个段最多被扩展两次,被极大的区间,如最下面的图。

这样状态数是 O(n) 的了。

image

image

image

image

image

image

image

image

103. AGC046

D

考虑记录保留的数,而先不考虑将其插入,可以 dfs 得到合法的 O(n3) 个状态,剩下长度为 a 的后缀,保留了 b0c1

而每个合法的状态可以对应的结果有交,考虑对于结果构造,使其对应的状态只有唯一个。

发现对于合法的结果串,可得到他的所有状态都是合法的,对于不合法的结果串,可得到他的所有状态都是不合法的,一一对应。

对于结果串 t,找到最大的 l 使得 s 的长度为 l 的后缀是 t 的子序列,计算剩下 0,1 个数,可得到唯一的状态 (l,b,c)

dpl,b,c,表示有多少个结果串 t(不管合不合法),对应唯一状态为 (l,b,c),转移考虑枚举前面添加了 0 还是 1,贪心进行子序列匹配。

答案对于所有合法状态的 dp 值求和即可。

image

image

E

一点不会。

image

posted @   蒟蒻orz  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示