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
发现出现 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\),且不是这两个区间,则总方案数是:
考虑加速计算。
将 \(l\) 递减排序,将 \(r\) 递增排序,则可以求出一个 \(c_i\) 表示 \(j\le c_i\) 的 \(r\) 都是可以用的,那么我们先计算 \(l_i\) 贡献系数,有:
那么我们只需要专心计算:
由此我们可以 \(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\)
同理考虑右端点的贡献即可。