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\times \gcd(a,b)|a+b \to qi^2|(p+q)i \to qi|(p+q)\to q|p \to b|a \]

反过来也能推到。

CF1967B2

\[a+b|b\times \gcd(a,b) \to (p+q)i|qi^2\to (p+q)|qi \to (p+q)|i \]

枚举 \(p,q\),因为 \(p<i,pi< n\),所以 \(p^2< \sqrt n\)\(q\) 同理。

容易做。

CF1967C

一个树状数组的结构。

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

用树状数组模拟求出 \(a_1\cdots a_{i-1}\),乘上对应系数可以求出 \(a_i\)

CF1967D

image

CF1967E1

经典双直线 \(\mathcal O(n\sqrt n)\)

77.CF1965

78.CF1969

CF1969E

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

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

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

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

79.CF335E

考虑知道 \(B\)\(A\)

对于一个高度为 \(i\) 的楼房,概率为 \(\frac{1}{2^i}\),高度 \(\ge i\) 的概率为 \(\frac{1}{2^{i-1}}\),小于的概率即为 \(1-\frac{1}{2^{i-1}}\)

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

\[p\sum_{k=0}^{+\infty}(1-p)^k(k+1)=\frac{1}{p}=2^{i-1} \]

得到对于 \(B\) 的贡献也是 \(2^{i-1}\),所以 \(A=B\)

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

再考虑知 \(A\)\(B\)

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

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

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

\[(n-j)P(\ge x)^2P(<x)^{j-1}(2^{i-1}-2^{i-2}(1+\sum_{k=0}^{j-1}\frac{k\cdot P(=x)^k}{P(<x)^k})) \]

再加上高度为 \(1\)\(n\)

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

80.CF1612F

\(f_{i,j}\) 表示时刻 \(i\),手中最大盔甲为 \(j\) 时最大的武器。

时间复杂度 \(\mathcal O(ans\cdot n)\)

分析知,\(ans\le \log n+\frac{m}{n}\)

81.CF1866E

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

故记录三个电梯最近使用的时间即可,时间复杂度 \(\mathcal O(q^3)\)

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] 主旋律

\(f_S\) 表示形成强联通分量的方案数。

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

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

\[f_S=2^{e(S)}-\sum_{T\subseteq S}\sum_{k=1}^{|T|}(-1)^{k+1}\cdot g_{k,T}\cdot 2^{e(T,S \setminus T)+e(S\setminus T)} \]

\(T=S\) 时,\(k>1\)

\[u_S = \sum_{k=1}^{|S|} (-1)^k \cdot g_{k, S} \]

\[f_S = 2^{e(S)} + \sum_{T \subseteq S} u_T \cdot 2^{e(T, S \setminus T) + e(S \setminus T)} \]

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

\[u_S=-f_{S}-\sum_{v \subseteq C} f_{C}\cdot u_{S\setminus C} \]

\(|S|=1\) 时,\(u_{S}=-1\)

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

因为转移 \(f_{S}\) 时如果 \(T=S\)\(k≠1\),因此可以先处理 \(k>1\) 时的部分 \(u_S\),再转移到 \(f_S\),最后再转移回 \(u_S\)

87.UVA1489

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

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

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

\(f_{k,0/1}\) 表示 \(j\sim k\) 的数的异或和为 \(0/1\) 的方案数。

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

88.CF1874E Jellyfish and Hack

拉格朗日插值倒推系数。

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

真的能重塑时光吗?

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

\[\frac{i!\cdot k! \cdot \binom{k+1}{i}}{(n+k)!} \]

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

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

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

\(f_{S,i}\) 表示集合 \(S\),分成 \(i\) 个非空子集合的方案数(带上子序列方案数),\(g_{S,i}\) 表示集合 \(S\),分成 \(i\) 个非空的互不关联的子集合的方案数(带上子集合拓扑序方案数),\(h_{S}\) 表示集合 \(S\),导出的 DAG 的拓扑序方案数。

\[f_{S,i}=\sum_{T\subseteq S} [|e(S\setminus T,T)|=0] \sum_{j=1}^{i} f_{S\setminus T,i-j}\cdot g_{T,j}\cdot (-1)^{j+1}\\ g_{S,i}=\sum_{\log_{2}(\operatorname{lowbit}(S))\in T,T \subseteq S} [|e(T,S\setminus T)|=0][|e(S\setminus T,T)|=0]h_{T}\cdot g_{S \setminus T,i-1}\\ h_{S}=\sum_{v\in S} [|e(v,S\setminus v)|=0]h_{S\setminus v} \]

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

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

\(f\)\(\mathcal O(3^n n^2)\)

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

\(x=1\sim n+1\) 带入,求出 \(F_{U}\) 的取值。

\[F_{S}(x)=\sum_{T\subseteq S} [|e(S\setminus T,T)|=0] F_{S\setminus T}(x)\cdot g_{T}(x) \]

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

根据拉格朗日插值:

\[f(x)=\sum_{i=1}^{n}y_i\prod_{j\ne i}\frac{x-x_i}{x_i-x_j} \]

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

总复杂度为 \(\mathcal O(3^n+n2^n)\)

鞅与停时定理复习

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\) 位截断,\(2^p>n\),加法操作对前面位的影响只有平移和至多一次 \(+1\)

\(f_{i,j,k}\) 表示 \(i\) 次操作后,最低 \(p\) 位为 \(k\),的概率。

\(k=0\)\(j\) 就表示 \(\operatorname{lowbit}\) 是几。

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

方法二

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

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

如果前面来个一个加法,则 \(j\to j+1\)

否则:

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

费用提前计算,答案为:

\[\sum_{i=0}^{n-1}\sum_{j=0\and j\bmod 2=0}^{i}f_{i,j}\cdot p+\sum_{i=0}^{k}f_{k,i}\cdot sum_{x+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';

方法三

预支加法操作。

\(f_{i,j}\) 表示操作了 \(i\) 次之后的 \(x\),再加上 \(j\) 之后末尾 \(0\) 的期望个数。

  • 这一步是乘法,那么 \(x\) 是偶数,如果 \(j\) 是奇数,末尾就没有 \(0\),否则是 \(f_{i-1,\frac{j}{2}}+1\),算上概率。
  • 这一步是加法,为 \(f_{i-1,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,其中 \(1\le i\le n\),当得到回答是 \(n\) 时,可知最大值。

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

每一段长度至少为 \(\frac{m}{mx}\),共 \(k\) 段,则 \(k\cdot \frac{m}{mx} \le n\),有 \(m\le mx\cdot \lfloor\frac{n}{k}\rfloor\)

这样查询次数就 \(\le 2n\) 了。

E

\(l=r\),则答案为所有 \(i\ne p_i\) 的个数。

找到 \(i\ne p_i\) 的最小最大 \(i\),为 \(L,R\)

必要条件是。

image

F

发现 \(\gcd (A)\)\(a_1\) 因子,\(\gcd(B)\)\(b_1\) 因子,还有翻转的情况。

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

\(D(10^9)\) 约为 \(1000\) 个。

\(f_{x,y}\) 表示 \(x|\gcd(A),y|\gcd(B)\) 的情况下满足的 \(a_i,b_i\) 个数。

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

对于 \(a_i,b_i\)

  • 对于 \(x|a_i,y|b_i\) 的,\(f_{\gcd(a_1,a_i),\gcd(b_1,b_i)}\leftarrow 1\)\(g_{\gcd(a_1,a_i),\gcd(b_1,b_i)}\leftarrow 0\)

  • 对于 \(x|b_i,y|a_i\) 的,\(f_{\gcd(a_1,b_i),\gcd(b_1,a_i)}\leftarrow 1\)\(g_{\gcd(a_1,b_i),\gcd(b_1,a_i)}\leftarrow c_i\)

  • 对于上面两种情况都满足的,显然选第一种,\(f_{\gcd(a_1,a_i,b_i),\gcd(b_1,b_i,a_i)}\leftarrow -1\)\(g_{\gcd(a_1,a_i,b_i),\gcd(b_1,b_i,a_i)}\leftarrow -c_i\)

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

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

多次询问就整体二分。

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

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

神题!!!

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

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

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

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

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

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

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

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

image

image

image

image

image

image

image

image

103. AGC046

D

考虑记录保留的数,而先不考虑将其插入,可以 dfs 得到合法的 \(\mathcal O(n^3)\) 个状态,剩下长度为 \(a\) 的后缀,保留了 \(b\)\(0\)\(c\)\(1\)

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

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

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

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

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

image

image

E

一点不会。

image

posted @ 2024-05-09 07:11  蒟蒻orz  阅读(28)  评论(0编辑  收藏  举报