题解 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;
题解 CF1264D1的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 【MAUI Blazor踩坑日记】6.mac标题栏颜色修改
MAUI中mac的标题栏颜色默认是灰白色的,有一点丑 如果我们想要自定义颜色,并且在运行时也能更改颜色,该怎么办呢 万幸从一个GitHub库中借鉴到了办法 https://github.com/Ben ...
- 2021-7-12 VUE的增删改查功能简单运用
Vue增删改查简易实例 <!DOCTYPE html> <html> <head> <title> </title> <style t ...
- vulnhub billu:b0x
知识点 SQLi.目录爆破.数据库操作.文件包含漏洞.提权.反弹shell 解题步骤 nmap扫描有80,22端口 nmap -sV -Pn -T 4 192.168.220.132 访问网页提示sq ...
- 文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
八.HEAP-DELETE(A,i)操作能够将结点 i 从堆 A 中删除.对于一个包含 n个元素的堆,请设计一个能够在 O(lgn)时间内完成的 HEAP-DELETE 操作. 文心一言: 要在 O( ...
- MySql Workbench 迁移工具 migration 提示缺少pyodbc 2.1.8 的解决方法
想把公司的数据库转到MySQL,所以想装个MySQL测试,发现新版的MySQL(8.0.34)默认安装还是有不少问题, 一.譬如表.字段大小写的问题: lower_case_table_names=0 ...
- AI绘画StableDiffusion:云端在线版免费使用笔记分享-Kaggle版
玩AI绘画(SD),自己电脑配置不够?今天给大家介绍一下如何baipiao在线版AI绘画StableDiffusion. Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源,可帮助您实现数 ...
- 小红书获得小红书笔记详情 API 返回值说明
item_get_video-获得小红书笔记详情 注册开通 smallredbook.item_get_video 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以 ...
- (数据科学学习手札154)geopandas 0.14版本新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在前两天,Python生态中 ...
- LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...
- Solution -「NOI 2020」时代的眼泪
Description Link. 给出一个二维平面以及一些点,保证点不在同行 / 同列.每次询问求出一个子矩阵里面的顺序对. Solution 卡常,卡你吗. 膜拜 dX. 基本是把 dX 的题解贺 ...