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
反过来也能推到。
CF1967B2
枚举 \(p,q\),因为 \(p<i,pi< n\),所以 \(p^2< \sqrt n\),\(q\) 同理。
容易做。
CF1967C
一个树状数组的结构。
相当于 \(k\) 次前缀和下的组合系数。
用树状数组模拟求出 \(a_1\cdots a_{i-1}\),乘上对应系数可以求出 \(a_i\)。
CF1967D
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\) 层出发的通道的期望长度(除去最左点),则有:
得到对于 \(B\) 的贡献也是 \(2^{i-1}\),所以 \(A=B\)。
注意,这里只能推出 \(B\) 走第 \(i\) 层的通道对 \(A\) 的贡献。
再考虑知 \(A\) 求 \(B\)。
这里就不同了,因为 \(A\) 对每一层不同的分配数量对 \(B\) 的贡献都有一个不同系数。
考虑从低往上考虑,不断将最大值限制提高。
设当前高度为 \(x\),长度为 \(j\),则有:
再加上高度为 \(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
83.P7470 [NOI Online 2021 提高组] 岛屿探险
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\) 的子集(缩点后),即其对应的原图的点集,然后容斥。
当 \(T=S\) 时,\(k>1\)。
考虑 \(u_{S}\),当 \(k=1\) 时,系数为 \(-f_{S}\),否则我们(定顺序)枚举包含最后一点 \(v\) 的强联通分量 \(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\) 段非空子集合,计算出方案数(集合去重)乘上对应的系数:
我们要统计的是子序列的方案数,计数的部分有两方面要考虑:
-
对于每个子集合,其序列为其导出子
DAG
的一个拓扑序。 -
每个子集看作一个点形成的大图是一个
DAG
。
记 \(f_{S,i}\) 表示集合 \(S\),分成 \(i\) 个非空子集合的方案数(带上子序列方案数),\(g_{S,i}\) 表示集合 \(S\),分成 \(i\) 个非空的互不关联的子集合的方案数(带上子集合拓扑序方案数),\(h_{S}\) 表示集合 \(S\),导出的 DAG
的拓扑序方案数。
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}\) 的取值。
这样做的好处是数组卷积变成了单个数相乘,时间复杂度为 \(\mathcal O(n3^n)\)。
根据拉格朗日插值:
对于每个 \(i\),右边乘式的分母容易求出,分子可以暴力多项式乘法 \(\mathcal O(n^2)\) 预处理总乘积,然后运用大除法(因为 \(j\ne i\)),这部分复杂度为 \(\mathcal O(n^2)\)。
总复杂度为 \(\mathcal O(3^n+n2^n)\)。
鞅与停时定理复习
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\) 是不会改变的,直接贡献答案。
费用提前计算,答案为:
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]
当前决策对未来的贡献与未来有关,现在考虑未来的,现在计算未来的影响
- 如果在当前决策把未来可能出现的情况提前计算好,通过状态传递到了未来,那到了未来是不是能直接把这个决策拿来用,是不是就能够进行转移了呢?
UVA10559 方块消除 Blocks
- 回顾这个问题,我们起初想使用费用提前计算,把每次对未来的贡献摊在当前自己身上。可是发现未来的决策并不只于当前决策有关,还与未来本身状态相关。于是又开了一维状态,将目光放长远,预测未来可能出现的状况并计算,记录在状态中传递到未来,并在未来直接使用,这依然是一类费用提前计算的问题。
P3354 [IOI2005] Riv 河流
P2053 [SCOI2007] 修车
92.[ARC132E] Paw
归纳证明一段不改变,左边是 \(<\),右边是 \(>\)。
这下只需要统计概率。
93.[AGC012D] Colorful Balls
94.[AGC007D] Shik and Game
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\)。
必要条件是。
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
99. AGC001
E
F
100. AGC002
D
E
F
101. AGC003
D
E
F
要么上下左右都有,要么都没有,要么只有一者有。
前两种方案容易计算。
102. AGC047
C
原根的性质。
D
考虑 LCA
。
E
先得到一个 \(1\),再求出一个位置的值的二进制,然后模拟二进制乘法。
F
啊啊啊,怎么都是盒图片。
神题!!!
每个时刻可以移动的范围一定是二维平面上一个矩形,并且每次扩展只能在矩形的角上扩展。
对于一个起点的问题,有时向左下向右上都行,将极限状态加入,压缩状态至 \(\mathcal O(n)\)。
对于一个极长的相邻两个位置差为 \(1\) 的连续段,中间的所有点第一次扩展都是扩展到这个连续段,我们可以之后将每个连续段整体扩展。
分析一下,如果从小于 \(i\) 的位置开始扩展能扩展到第 \(i\) 段,则从第 \(i\) 段开始无法进行扩展。
证明:不妨设扩展到第 \(i\) 段时为向右上,这样第 \(i\) 段一定递增。如果从第 \(i\) 段开始时第一步能向左扩展,则左侧一段也是递增且该段的值域正好在第 \(i\) 段值域之下,此时这两段可以合并,矛盾。因此从第 \(i\) 段出发只能向右。而值为第 \(i\) 段值域下界减一的元素在这一段左侧(从左侧出发可以向右上扩展到这一段),因此从第 \(i\) 段向右不能向右下,只能向右上。而如果可以向右上扩展,则说明下一段为递增且下一段值域下界为这一段值域上界加一,此时这两段又可以合并,矛盾。因此从这一段开始无法进行扩展。
这样多扩展一段会关闭一个段的扩展,考虑一些极大的区间,。。。
然后一个段最多被扩展两次,被极大的区间,如最下面的图。
这样状态数是 \(\mathcal O(n)\) 的了。
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\) 值求和即可。
E
一点不会。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18174804