Codeforces Div.2 979 E-G

E

这个最大分值显然是:设 \(c[i]\) 为元素 \(i\) 的出现次数,做前缀 \(min\),然后求和

考虑到我们只关心各个元素的出现次数,那么设原本序列是 \(cnt\),子序列的是 \(b\)

则需要乘上一个组合数 \(\prod {cnt[i] \choose b[i]}\)

\(f_{i,j}\) 为元素 \([0,i]\),出现次数前缀 \(min\) 现在是 \(j\) 的方案数的分数总和

\(g_{i,j}\) 为方案数

首先这个状态需要满足 \((i+1)\times j<=n\),则调和级数状态数

然后转移只需要枚举当前选多少个例如选 \(t\) 个就有

\[f_{i,j}\times C(cnt[i+1],t)+g_{i,j}\times min(j,t)*C(cnt[i+1],t)\to f_{i,min(t,j)} \]

可以前缀和优化转移

F

发现出现 xyxy 这种东西就没了,而且答案具有单调性

所以我们可以考虑双指针求 \(mnl_r\)

这是简单的,我们找到 \(r\) 前面第一个 \(a_r\),判断有没有数“跨过它”即可。至于更前面的与 \(a_r\) 相同的数字已经在更前面判断过了。

也就是我们对于每个位置维护 \(nxt_i\) 表示下一个与 \(a_i\) 相同的数的位置,没有则设置为 \(i\)\(lst_i\) 是上一个 \(a_i\) 相同的数的位置,我们维护 \(r,nowl\),最初都是 \(1\),执行以下操作:

  • \(nowl\le lst_r-1\),则判断是否 \(\max nxt_{nowl\sim lst_r-1}> lst_r\),如果有则增加 \(nowl\),重复,否则跳出

利用线段树维护即可。

G

考虑到一个策略:

  • 取出 \(l_{\max},r_{\min}\)\(l_{\max}\le r_{\min}\) 则已经合法,跳出

  • 删去这两个区间,代价加上 \(l_{\max }-r_{\min}\) 重复

    这里保证了这两个区间修改后相交的条件,并且最终的合法区间一定在这个区间里面,用这个操作是充分且必要的

考虑两区间 \([l_i,r_i],[l_j,r_j]\),默认 \(l_j>r_i\)

设有 \(a\) 个区间满足 \(l> l_j\)\(b\) 个区间满足 \(r< r_i\),且不是这两个区间,则总方案数是:

\[\sum {a\choose x}{b\choose x}2^{n-a-b-2}={a+b\choose a}2^{n-a-b-2} \]


考虑加速计算。

\(l\) 递减排序,将 \(r\) 递增排序,则可以求出一个 \(c_i\) 表示 \(j\le c_i\)\(r\) 都是可以用的,那么我们先计算 \(l_i\) 贡献系数,有:

\[\begin{aligned} \sum_{j=1}^{c_i}{i-1+j-1\choose i-1}2^{n-i-j}&=2^{n-i}\sum_{j=1}^{c_i}{i-1+j-1\choose i-1}2^{-j}\\ &=2^{n-i-1}\sum_{j=0}^{c_i-1}{i-1+j\choose j}2^{-j} \end{aligned} \]

那么我们只需要专心计算:

\[\begin{aligned} f(x,y)&=\sum_{j=0}^y{x+j\choose j}2^{-j}\\ &=\sum_{j=0}^y{x+j-1\choose j}2^{-j}+{x+j-1\choose j-1}2^{-j}\\ &=f(x-1,y)+2^{-1}f(x,y-1)\\ &=f(x-1,y)+2^{-1}(f(x,y)-{x+y\choose y}2^{-y}) \end{aligned} \]

由此我们可以 \(O(1)\) 地移动 \(x\)\(y\)

也就是我们可以由 \(f(x_1,y_1)\)\(|x_1-x_2|+|y_1-y_2|\) 的时间内得到 \(f(x_2,y_2)\)

而又有我们所求是 \(f(i-1,c_i-1)\),第一维不断增大,第二维不断减小,总 \(1\to n\) 变化量 \(O(n)\)

这就好了。

\(f(0,0)=1\)

同理考虑右端点的贡献即可。


posted @ 2024-10-21 19:57  spdarkle  阅读(6)  评论(0编辑  收藏  举报