首页 > 其他分享 >近期总结 2024.2.26

近期总结 2024.2.26

时间:2024-02-26 22:12:10浏览次数:35  
标签:总结 ... 2024.2 le 10 字母 合并 26 合法

dp 专场 *2。

CF1608F MEX Counting

题意:给出 \(n,m,b_{1...n}\),求出有多少个长度为 \(n\) 的序列 \(a\) 满足 \(\forall i\in[1,n],\space 0\le a_i\le n\) 且 \(|\operatorname{mex} \{a_1,a_2,...,a_i\}-b_i|\le m\)。

\(1\le n\le 2000,\space 1\le k\le 50\)


很简单的 dp,个人认为难度下位紫或更低(?)

考虑枚举 \(i=1,2,...,n\),依次填写 \(a_1,a_2,...,a_n\),并维护当前的 \(\operatorname{mex}\) 结果,不妨设为 \(j\)。当前填的数有三种:

  • \(<j\),并不会产生什么影响

  • \(=j\),此时当前的 \(\operatorname{mex}\) 会变大,变大多少取决于 \(j\) 后面一段已填过的数的个数。

  • \(>j\),这个数字可能对未来有影响,但我们目前未知

直接 dp,设 \(f[i,j,k]\) 表示填完前 \(i\) 个数,并且 \(\operatorname{mex}\) 结果为 \(j\),其中还有 \(k\) 数 \(>j\)。

考虑 \(a_i\) 的影响,如果 \(\operatorname{mex}\{a_1,a_2,...,a_{i-1}\}\) 还是 \(j\),那么 \(a_i<j\) 或 \(a_i>j\),转移:

  • 如果 \(>j\) 的数字种类数不变:\(f[i,j,k]\gets f[i-1,j,k]\times(j+k)\)

  • 如果 \(>j\) 多了一个数字种类:\(f[i,j,k]\gets f[i-1,j,k-1]\times k\)

注意我们不计算这 \(k\) 种数的取值贡献,而是他们之间的相对大小顺序

接下来如果 \(\operatorname{mex}\{a_1,a_2,...,a_{i-1}\}<j\),不妨设为 \(x\),那么中间 \([x+1,j-1]\) 这一段一定都在前 \(i-1\) 个数出现过,我们不妨直接拿其中 \(>x\) 中的一些填入这 \((j-1)-(x+1)+1=j-x-1\) 个数中。由于我们已经考虑了相对大小顺序,直接拿最小的那几个填入即可。

  • 转移: \(f[i,j,k] \gets f[i-1,x,k+(j-x-1)]\)

总转移式

\[f[i,j,k]=f[i-1,j,k]\times (j+k)+f[i-1,j,k-1]\times k+\sum_x f[i-1,x,k+j-x-1] \]

\(j\) 个数为 \(O(m)\),前缀和优化即可做到 \(O(n^2m)\)。

实现时注意细节问题。 记录


CF1450G

题意:一个小写字母组成的字符串 \(s\),其中字母 't', 'r', 'y', 'g', 'u', 'b' 不会出现,还给定了一个有理数 \(k=\frac ab\)。

每次可以选择 \(s\) 中的一种字母,将 \(s\) 中所有的这种字母变成另一种字母,但有个条件:设这个字母出现了 \(c\) 次,需要覆盖这 \(c\) 个位置的最小区间为 \([l,r]\),那么需要满足 \(k\cdot (r-l+1)\le c\)。

对于所有 \(s\) 中出现的字母,求出是否可以通过若干次操作使得 \(s\) 中全是这种字母。

\(1\le n\le 5000,\space 1\le a\le b\le 10^5\)


因为有 \(6\) 种字母不会出现,所以一共只有 \(20\) 种,可以考虑状压。

我们把字母分类,一类是一开始就不合法的,另一类是一开始合法的。

一开始已经合法的两种字母显然不需要合并,因此我们一开始需要将一种合法的字母合并到一种不合法的,然后产生一个新的状态。

如果还不合法则继续合并,直到这个字母合法,此时这是一个字母集合(合并的集合),然后把他作为一个新的合法“字母”继续合并。

设 \(f[S]\) 表示是否可以把 \(S\) 中的字母合并起来,并且合并出去。

  • 把 \(S\) 中的字母分成两个合法集合,显然这两个集合可以分别合并出去,不需要额外合并起来:\(f[S\cup T]\gets f[S]\operatorname{and} f[T]\)

  • 合并到一个本来不合法的字母:\(f[S\cup \{x\}]\gets f[S]\)

时间 \(O(3^n)\),需要优化。

注意到如果两个集合 \(S_1,S_2(S_1\cap S_2=\emptyset)\) 对应的覆盖区间有交,且 \(S_1,S_2\) 都是合法的,那么 \(S_1\cup S_2\) 一定是合法的。

观察这能给我们什么思考,我们在第一种转移中枚举 \(T\),如果 \(S\) 和 \(T\) 对应的覆盖区间有交且 \(f[S]=f[T]=1\),那么一定得到 \(f[S \cup T]=1\)。

进一步的,钦定 \(S\) 和 \(T\) 都是由若干个合法的集合合并到一个不合法的字母形成的,设这两个字母为 \(x,y\),设 \(S'=S\oplus \{x\}\),其实我们可以先把 \(T\) 与 \(S'\) 合并,再转为 \(x\)。由于 \(S,S',T\) 都合法,如果去掉 \(x\) 后 \(S',T\) 对应区间仍然有交,则 \(f[S'\cup T]=1\);如果无交,通过第一种转移也可以使得 \(f[S'\cup T]=1\)。

对于 \(S,T\) 由多个集合合并起来的,可知每个集合都合法。拆分每个集合,如果可以找到一条分界线来分划这些集合对应区间显然合法;如果找不到,依次合并起来就好。

因此,第一种转移时,我们枚举的 \(S,T\) 额外保证 \(S,T\) 对应区间无交,即可优化。设 \(k\) 为字母种类数,时间 \(O(k2^k)\)。 记录


CF1621G Weighted Increasing Subsequences

题意:给出 \(n,a_{1...n}\),对于每个上升子序列 \(a_{i_1},a_{i_2},...,a_{i_m}\),子序列中 \(a_{i_j}\) 有贡献当且仅当存在 \(k\) 满足 \(k>i_m\) 且 \(a_{i_j}<a_k\),求所有上升子序列的贡献和,模 \(10^9+7\)。 \(1\le n\le 2\times 10^5,\space 1\le a_i\le 10^9\)

考虑把 \(a\) 转化为一个排列 \(p\),相同的数则前面比后面大。不妨考虑 \(q=p^{-1}\),\(p\) 的上升子序列仍然对应 \(q\) 的上升子序列。对于一个上升子序列,设结尾位置为 \(x\),那么子序列中的一个位置 \(y\) 有贡献的条件是一个位置 \(z\) 满足 \(z>y\) 且 \(q_z>q_x\)。

我们只需要用总方案数减去不合法的即可,不合法的条件是不存在 \(z\) 满足 \(z>y\) 且 \(q_z>q_x\),相当于 \(q_x\) 是 \(q_{y...n}\) 的最大值。

我们对于每个位置 \(i\) 考虑其贡献,设 \(q_{i...n}\) 的最大值位置为 \(w\),我们要算的就是包含 \(i\) 且以 \(w\) 结尾的上升子序列个数,为 \(q_{1...i}\) 以 \(i\) 结尾的上升子序列个数 \(\times q_{i...w}\) 以 \(i\) 开头以 \(w\) 结尾的上升子序列个数。前半部分好做,注意 \(w\) 是由 \(i\) 更新的,不更新时直接维护,更新时只需要清空树状数组,时间 \(O(n\log n)\)。记录


CF582D Number of Binominal Coefficients

题意:给出质数 \(p\) 和整数 \(\alpha,A\),求有多少对 \((n,k)\) 满足 \(0\le k\le n\le A\) 且 \(p^\alpha| {n\choose k}\),答案模 \(10^9+7\)。 \(1\le p,\alpha\le 10^9,\space 0\le A\le 10^{1000}\)


Kummer 定理:\({a+b \choose a}\) 中质数 \(p\) 的次数为 \(a+b\) 在 \(p\) 进制下进位次数。

感性证明:考虑对初始为 \(0\) 的数连续做 \(n\) 次 \(+1\),在 \(p\) 进制下会进位 \(\lfloor \frac np \rfloor+\lfloor \frac n{p^2} \rfloor +...\) 次,这相当于 \(n!\) 中 \(p\) 的次数。而 \({a+b \choose a}=\frac{(a+b)!}{a!b!}\),相当于连续 \(a+b\) 次 \(+1\) 的贡献,然后去掉 \(a\) 和 \(b\) 各自进位的贡献。

转 \(p\) 进制就可以直接数位 dp 了。

细节有点多,记录


CF1103D Professional layer

题意:给出 \(n,k,a_{1...n},e_{1...n}\),一次性修改 \(x\) 个数(\(x\) 自己定),对于每个修改的数 \(a_i\),选择 \(a_i\) 的一个约数 \(d\) 修改为 \(\frac{a_i}d\),使得最终 \(\gcd(a_1,a_2,...,a_n)=1\),求最小的 \(x\sum\limits_i e_i\)。 \(1\le n\le 10^6,\space 1\le k,a_i\le 10^{12},\space 1\le k\le 10^{12}\)

--

先求出 \(\gcd\),设为 \(g\),\(g\) 中质因子最多 \(10\) 个,设实际个数为 \(m\)。

我们只关心 \(a_i\) 中 \(g\) 中的质因子,求出每个质因子的次数。不难发现每个质因子次数都相同的两个数除了 \(e_i\) 是等价的,考虑分为若干个等价类,求出每个等价类的前 \(m\) 小的 \(e_i\) 分别是多少。

搜一下,等价类差不多一万多一些,比较少。

然后直接状压 dp,设 \(f[i,j,S]\) 表示前 \(i\) 个等价类处理的质因子集合为 \(S\),修改了 \(j\) 个数,最小代价是多少,直接转移即可,时间 \(O(\text{可过})\)。记录

标签:总结,...,2024.2,le,10,字母,合并,26,合法
From: https://www.cnblogs.com/Sktn0089/p/18035706

相关文章

  • 比赛总结录
    比赛总结录【寒假集训】20240206测试90/400T1.珠子题目链接0/100思路:双指针,赛场上想到了,但是没有打出来代码。T2.数组题目链接0/100思路:暴力+记录。赛场上也想到了,但是赛场上忽略了一个点。又因为多打了几行而丢了$40pts$。T3.幸运区间题目链接60/100思......
  • 2024.2.25模拟赛T3题解
    题目推出dp柿子之后,枚举\(i\)的时候用线段树维护\(1-i\)的\(mex\)段,对于每一段,分别使用线段树套李超树维护,对于每个\(mex\)再次使用线段树套李超树维护即可code#include<bits/stdc++.h>usingnamespacestd;#defineN600005#defineintlonglongintn,m;consti......
  • 2024.2.25模拟赛T1题解
    题目考虑DP式子之后,可以通过堆维护函数,求出对应值code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN200005intzu,n,d,tg,num;inta[N];priority_queue<int>q;signedmain(){ scanf("%lld",&zu); while(zu--){ scanf(&qu......
  • 2024.2.25模拟赛T2题解
    题目枚举根之后,考虑每次连边的贡献,通过贡献算出每个点的权值,每次找出权值最大的点,又要保证父亲在儿子之前,所以将父亲和儿子合并,权值也合并一下即可code#include<bits/stdc++.h>usingnamespacestd;#defineN2005intans,n,k;intsz[N],deg[N],du[N],fu[N],f[N],h[N];str......
  • 2024.2.26模拟赛T2题解
    题目对询问扫描线,建出\(PAM\)的失配树之后,每次查询相当于,把\(r\)对应节点到根路径染色之后,有多少个节点的值大于\(l\),可以树剖+ODT实现code#pragmaGCCoptimize("Ofast","inline","-ffast-math")#pragmaGCCtarget("avx,sse2,sse3,sse4,mmx")#include<bits/s......
  • 闲话2.26
    哎我2.25闲话呢你画我猜真好玩......
  • 2024.2.26 LGJ Round
    A给出一个\(n\)个顶点的有向图,求有多少个长度小于\(k\)的环(环可以经过重复的结点)。两个环不同当且仅当顶点序列不同。\(n\le35,k\le1e6\)。矩阵乘法模板题。枚举起点,求出走\(\lek\)步到达自己的方案数。只需要记录\(f_i\)表示以\(i\)结尾的路径个数,以及\(g_i\)......
  • 2024.2.26闲话——错误的时间复杂度
    推歌:猛独が襲う——一二三想了一个非常奇怪的逻辑。我们知道斐波那契数列是需要递推的。我们由前两个数推到第\(3\)个数的时间复杂度是\(O(1)\)。推第\(4\)个数是\(O(1)\)的基础上加\(1\)还是\(O(1)\)。然后我们以此类推下去,递推求斐波那契数列任意一项都是\(O(1)......
  • 2024.2.26模拟赛T1题解
    题目先建出圆方树,题目转换为数长度为\(2*L-1\)的路径数,长链剖分code#include<bits/stdc++.h>usingnamespacestd;#defineN2000005#definelllonglongintn,m,top,tot,cnt,L,k;intdfn[N],low[N],zhan[N],h[N];structAB{ inta,b,n;}d[N*4];voidcun(intx,int......
  • 91st 2024/2/26 省选联赛训练-1st
    迟来的新年快乐!这次的机会挺难得的,初三了,好说歹说从学校里跑出来训练了,就一定要珍惜时间进入正题今天的比赛难度高,但也没有省选那么难属于是思路比较难想那类T1题目有些疑惑,但总体表达还可,应该是太久没接触这种表达较专业的题目而一时难以适应看题需要认真且专心调代码时状......