首页 > 其他分享 >题解 CF1264D1

题解 CF1264D1

时间:2023-04-29 11:22:53浏览次数:38  
标签:dbinom 题解 最大值 CF1264D1 扩展 我们 考虑 数量

前言

数学符号约定:

\(\dbinom{n}{m}\):表示 \(n\) 选 \(m\) 。

如非特殊说明,将会按照上述约定书写符号。

题目分析:

考虑题目的问题弱一点的版本,假设此时我们的括号序列是确定的如何求其括号匹配的最深深度。

如果你有些许 dp 基础的话,不难想到如下做法:

考虑位置 \(i\),将区间 \([1,i]\) 内的 ( 数量设为 \(a_i\),区间 \([i+1,n]\) 内的 ) 设为 \(b_i\),此时答案应该是 \(\max_{i\in [1,n]}(\min(a_i,b_i))\)。

经过观察,我们发现:\(a_i\) 是不断增加的,\(b_i\) 是不断减少的。

证明的话考虑 \(a_i\) 的区间在不断的扩展,而 \(b_i\) 的区间在不断缩小,设扩展前的值为 \(a\),则当 \(a\) 向外扩展一格的时候只会遇到 (),故 \(a\) 扩展后的值 \(a'\) 只会等于 \(a\) 或 \(a+1\),故显然 \(a_i\) 在过程中是不断增加的。

对于 \(b_i\) 的证明同上,在这里不多赘述。

考虑答案式子 \(\max_{i\in [1,n]}(\min(a_i,b_i))\),我们可以肯定当 \(a_i = b_i\) 的时候一定会取到最大值,注意这个条件不是必要的,即最大值的情况不一定是 \(a_i = b_i\),但当 \(a_i = b_i\) 时一定可以取到最大值,证明可以考虑木桶效应。

让我们继续考虑 \(a_i=b_i\) 对应的 \(i\) 的情况数量,发现我们有且仅有一种 \(i\) 能使得 \(a_i = b_i\),证明如下:

假设我们已经到了第一次出现 \(a_i = b_i\) 的点了,考虑 \(i\) 向下扩展一格会遇到什么,它肯定只会碰到 (),如果碰到的是 (,则此时 \(b_i\) 的值一定不变,因为它对 \(b_i\) 没有贡献,但是因为 \(a_i\) 多了一个 ( 所以值会加一。如果碰到的是 ),则此时 \(b_i\) 的值必定会发生改变。故我们可以的得出,我们的每一次扩展都会必然导致 \(a_i\) 或 \(b_i\) 产生变化,不存在扩展之后 \(a_i\) 和 \(b_i\) 都不产生变化的情况。故只有一种 \(i\) 能使得 \(a_i = b_i\)。

现在有了上述的条件我们就能保证我们不会出现算重或算漏的情况了,考虑具体做法:

枚举 \(i\),记 \([1,i]\) 上 ( 的数量为 \(s_1\),记 \([1,i]\) 上 ? 的数量为 \(s_2\),记 \([i+1,n]\) 上 ) 的数量为 \(s_3\),记 \([i+1,n]\) 上 ? 的数量为 \(s_4\),枚举答案 \(j\),则当答案为 \(j\) 时的贡献就是 \(j \dbinom {s_2}{j-s_1} \dbinom {s_4}{j-s_3}\)。

那么为什么贡献是这样的呢?或者说 \(\dbinom {s_2}{j-s_1}\) 和 \(\dbinom {s_4}{j-s_3}\) 的意义是什么呢?根据我们推出的 \(a_i = b_i\) 的情况是最大值,考虑我们离当前答案 \(j\) 还差多少 (),然后将差的数量个问号变成 (),然后差的数量显然就是 \(j-s_1\) 和 \(j - s_3\),而 \(\dbinom {s_2}{j-s_1}\) 和 \(\dbinom {s_4}{j-s_3}\) 则表示的是 \(s_2\) 和 \(s_4\) 个问号中选择 \(j-s_1\) 和 \(j - s_3\) 的方案数(毕竟括号是无标号的)。

考虑预处理一下阶乘和 \(s_{1 \cdots 4}\),然后我们就能 \(\mathcal O (n^2)\) 的复杂度做完了这个题。

注意:

  • 你会发现我似乎没有讨论为什么这么扫为什么是合法的,即为什么我们能够保证我们有那么多的 ? 可选,实际上我们确实无法保证有那么多的 ? 可选,但是我们可以保证的是,如果没有那么多 ? 可选,则此时一定不会产生贡献,这一点在我们的组合数中也是有体现的。

    换言之,就是求组合数的时候需要判断一下它会不会是 \(0\)。

  • \(0! = 1\)。

代码实现

这里只给出了关键部分的代码实现,其余部分还恳请读者自己实现:

// sum1 表示 `(` 数量的前缀和
// sum2 表示 `)` 数量的前缀和
// sum3 表示 `?` 数量的前缀和
int ans = 0;
for (int i = 1; i <= n; i++) {
    int s1 = sum1[i];
    int s2 = sum3[i];
    int s3 = sum2[n] - sum2[i];
    int s4 = sum3[n] - sum3[i];
    for (int j = 0; j <= n; ++j) {
        ans = add(ans, mul(mul(C(s2, j - s1), C(s4, j - s3)), j));
    }
}
cout << ans << endl;

标签:dbinom,题解,最大值,CF1264D1,扩展,我们,考虑,数量
From: https://www.cnblogs.com/larry76/p/17363731.html

相关文章

  • 题解 CF1264D2
    前言建议大家看一下我对于D1的题解(传送门)后再看本题解,本题解是基于那篇题解的基础上书写的。数学符号约定\(\dbinom{n}{m}\):表示\(n\)选\(m\)。如非特殊说明,将会按照上述约定书写符号。题目分析首先引用一下D1的答案:\(\displaystyle\sum_{i=1}^n\displaystyle\sum_{......
  • [ARC125E] Snack 题解
    不难发现一个较简单的网络流模型:源点向所有糖果\(i\)连\(a_i\)的容量;所有糖果向所有人\(i\)连\(b_i\)的容量;所有人\(i\)向汇点连\(c_i\)的容量。但第二步中建出的边数达到了惊人的\(O(nm)\),显然过不去。考虑优化。从最大流角度优化较困难,由于最大流等价于最小......
  • P4423 题解
    前言题目传送门!更好的阅读体验?刚学分治就来写篇题解纪念一下,其实和平面最近点对一样的(总共四倍经验!)。思路根据P7883的分治思路,这题我们可以考虑用相似的方法解决。首先将点集按\(x\)坐标从小到大排序。然后分治。对于\(\left[l,r\right]\)区间,分治为\(\left[l,mid......
  • 题解 P3225 [HNOI2012] 矿场搭建
    解析传送门一道简单的tarjan题题意:在无向图中找一些点,这些点组成的的点集记为\(V\),使得去掉任意一个点,剩下的每一个点都可以到达\(V\)中任意一个点,求点集\(V\)的大小的最小值及其方案数。去掉一个点,很自然的联想到割点,那么考虑一下割点在不在备选集合中。如图,显然可以看出,......
  • Codeforces Round 868 (Div. 2) A-E题解
    比赛地址这把真不在状态,麻了,看来还得再练A.A-characteristic题意:给出n和k,要求构造只含1和-1数组a,存在k对(i,j)(i≠j),有a[i]*a[j]=1Solution令构造的数组有x个1和y个-1,那么其对于答案的贡献有\[x*(x-1)/2+y*(y-1)/2\]又因为有x+y=n,所以可以转化成关于x的一元二次方程化简后......
  • COMPSCI 589 问题解答
    COMPSCI589Homework4-Spring2023DueMay6,2023,11:55pmEasternTime1InstructionsThishomeworkassignmentconsistsofaprogrammingportion.Whileyoumaydiscussproblemswithyourpeers,youmustanswerthequestionsonyourownandimplementall......
  • P4681 [THUSC2015]平方运算 题解
    题面链接简要题意给定一个序列,区间.map([](intx){x=x*x%p;});,区间求和。p给定,为小质数。\(N,M\le10^5\)。题解而把一个数看作一个点,向其平方取模连一条边,则最终必然构成一个基环森林,注意到\(P\)很小,每个数经过\(11\)次迭代之后就会进入环中。对于一个区间,如......
  • “makefile:425: *** 遗漏分隔符 。 停止。”问题解决
    在终端下输入make时出现“makefile:2:***遗漏分隔符。停止。”问题,原因是在编写makefile文件时:3:3.c        gcc-o33.cgcc前的是tab分隔符,不能用空格,否则会出现“makefile:2:***遗漏分隔符。停止。”提示。。。make中规定每一Shell命令之前的开头必须使用<t......
  • 题解(开始学知识点
    D.FrogTraveler1900dpgq!https://codeforces.com/contest/1602/problem/D题解:我们可以通过类似bfs的过程找到每个点的能到达的所需步数最小的点,完成更新,但每个点能被哪些点到达很难判断,故我们反过来考虑,如果我们能得到从n->0的最短跳跃次数,亦得解,而每个点下一步能到达的点容......
  • P1345 [USACO5.4]奶牛的电信Telecowmunication 题解
    一、题目描述:n个点,m条边,给定起点s和终点t,求最少删去几个点后,s和t不连通。注意,s和t不能删掉。1<=n<=100,1<=m<=600; 二、解题思路:刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。我们需要将将割点转化为割边。把一个点切成两半......