[CF1264D]Beautiful Bracket Sequence
题目描述
This is the hard version of this problem. The only difference is the limit of $ n $ - the length of the input string. In this version, $ 1 \leq n \leq 10^6 $ .
Let's define a correct bracket sequence and its depth as follow:
- An empty string is a correct bracket sequence with depth $ 0 $ .
- If "s" is a correct bracket sequence with depth $ d $ then "(s)" is a correct bracket sequence with depth $ d + 1 $ .
- If "s" and "t" are both correct bracket sequences then their concatenation "st" is a correct bracket sequence with depth equal to the maximum depth of $ s $ and $ t $ .
For a (not necessarily correct) bracket sequence $ s $ , we define its depth as the maximum depth of any correct bracket sequence induced by removing some characters from $ s $ (possibly zero). For example: the bracket sequence $ s = $ "())(())" has depth $ 2 $ , because by removing the third character we obtain a correct bracket sequence "()(())" with depth $ 2 $ .
Given a string $ a $ consists of only characters '(', ')' and '?'. Consider all (not necessarily correct) bracket sequences obtained by replacing all characters '?' in $ a $ by either '(' or ')'. Calculate the sum of all the depths of all these bracket sequences. As this number can be large, find it modulo $ 998244353 $ .
Hacks in this problem can be done only if easy and hard versions of this problem was solved.
输入格式
The only line contains a non-empty string consist of only '(', ')' and '?'. The length of the string is at most $ 10^6 $ .
考虑 \(O(n^2)\)
先尝试求出深度。一个括号序列我们最后一定可以把他删成 ((((....)))) 的形式,也就是在括号序列中找到一个位置 \(i\) , \(s_i=\)'(' 且 \(l\) 左边的左括号数量等于其右边的右括号数量。枚举这个 \(i\) 在哪。设 \(i\) 前面有 \(l_i\) 个左括号, \(p_i\) 个问号,后面有 \(r_i\) 个右括号,\(q_i\) 个问号。
\(\begin{aligned}
&\sum\limits_{i=1}^n\sum\limits_{j=0}^{p_i}(l_i+j)\binom{p_i}{j}\binom{q_i}{j+l_i-r_i}\\&=\sum\limits_{i=1}^nl_i\sum\limits_{j=0}^{p_i}\binom{p_i}{j}\binom{q_i}{q_i-j-l_i+r_i}+\sum\limits_{i=1}^n\sum\limits_{j=0}^{p_i}j\binom{p_i}{j}\binom{q_i}{q_i-j-l_i+r_i}\\&=l_i\binom{p_i+q_i}{q_i-l_i+r_i}+\sum\limits_{i=0}^{p_i}p_i\binom{p_i-1}{j-1}\binom{q_i}{q_i-j-l_i+r_i}
\\&=l_i\binom{p_i+q_i}{q_i-l_i+r_i}+p_i\binom{p_i+q_i-1}{q_i-l_i+r_i-1}
\end{aligned}\)
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5,P=998244353;
char s[N];
int l[N],p[N],r[N],q[N],jc[N],iv[N],inv[N],n,ans;
int C(int n,int m)
{
if(n<m||m<0)
return 0;
return jc[n]*1LL*iv[m]%P*iv[n-m]%P;
}
int main()
{
scanf("%s",s+1),n=strlen(s+1);
for(int i=1;s[i];i++)
{
l[i]=l[i-1]+(s[i]=='(');
p[i]=p[i-1]+(s[i]=='?');
}
for(int i=n;i;i--)
{
r[i]=r[i+1]+(s[i]==')');
q[i]=q[i+1]+(s[i]=='?');
}
jc[0]=jc[1]=iv[0]=iv[1]=inv[1]=1;
for(int i=2;i<N;i++)
{
jc[i]=1LL*jc[i-1]*i%P;
inv[i]=1LL*(P-P/i)*inv[P%i]%P;
iv[i]=1LL*iv[i-1]*inv[i]%P;
}
for(int i=1;i<=n;i++)
{
(ans+=(1LL*l[i]*C(p[n],q[i+1]-l[i]+r[i+1])+1LL*p[i]*C(p[n]-1,q[i+1]-l[i]+r[i+1]-1))%P)%=P;
}
printf("%d",ans);
}
[CF1264D]Beautiful Bracket Sequence的更多相关文章
- CF1264D2 Beautiful Bracket Sequence
我们枚举每两个字符的空档,统计一个空档左边有 \(l\) 个左括号, 右边有 \(r\) 个右括号,左边有 \(u\) 个问号,右边有 \(v\) 个问号. 则对于 \(p\) 的答案 \(ans_p ...
- CF1264D2 Beautiful Bracket Sequence (hard version)
考虑\(D1\)的\(O(n^2)\),我们直接进行组合处理. 考虑在\(p\)这个位置,左边有\(l\)个(,右边有\(r\)个),左边有\(l\)个问号,右边有\(r\)个问号. 这个位置的贡献为 ...
- CF1264D1 Beautiful Bracket Sequence (easy version)
考虑在一个确定的括号序列中,我们可以枚举中间位置,按左右最长延伸出去的答案计算. 我们很自然的思考,我们直接维护左右两边,在删除一些字符后能够延伸的最长长度. 我们设\(f_{i,j}\)为\(i\) ...
- Codeforces 1264D - Beautiful Bracket Sequence(组合数学)
Codeforces 题面传送门 & 洛谷题面传送门 首先对于这样的题目,我们应先考虑如何计算一个括号序列 \(s\) 的权值.一件非常显然的事情是,在深度最深的.是原括号序列的子序列的括号序 ...
- UESTC 1546 Bracket Sequence
Bracket Sequence Time Limit: 3000MS Memory Limit: 65536KB 64 ...
- CF#138 div 1 A. Bracket Sequence
[#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...
- CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)
E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...
- Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- (中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...
随机推荐
- Linux 内核音频子系统调试
debugfs 文件系统 debugfs 可以为 Linux 内核各个模块的分析调试,提供许多信息,如音频子系统的 ASoC,以及 tracing 等.debugfs 文件系统可以通过命令行工具挂载, ...
- 带你上手基于Pytorch和Transformers的中文NLP训练框架
本文分享自华为云社区<全套解决方案:基于pytorch.transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据>,作者: 汀丶 . 1.简介 目标: ...
- 杰哥教你面试之一百问系列:java多线程
java多线程是java面试中的高频问题,如何才能在面试中脱颖而出呢?熟读这里的一百个java多线程面试问题即可. 1. 什么是线程?什么是进程? 回答: 线程是操作系统能够进行调度的最小执行单位,它 ...
- FastDFS入门
一.系统架构 二.构成部分 1.Tracker Server:跟踪服务器,记录文件信息,可单台或集群部署. 2.Storage Server:存储服务器,文件存储位置,分卷或分组部署. 3.Clien ...
- Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法
目录 命令行脚本参考 - bat 命令行脚本参考 - bash 值得学习的知识点 1. 识别终端使用的语言 2. 函数的编写 3. 获取用户的输入 4. bat文件老是乱码怎么办 有时候为了方便别人使 ...
- 模块化打包工具-初识Webpack
1. 为什么需要模块化打包工具 在上一篇文章中提到的ES Module可以帮助开发者更好地组织代码,完成js文件的模块化,基本解决了模块化的问题,但是实际开发中仅仅完成js文件的模块化是不够的,尤其是 ...
- 其它——Redis与Mysql双写一致性方案解析
文章目录 一 前言 二 一致性方案 三 先更新数据库,再更新缓存 四 先删缓存,再更新数据库 五 先更新数据库,再删缓存 一 前言 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取 ...
- .Net7自定义GC垃圾回收器
1.前言 CLR和GC高度耦合,.Net7里面分离CLR和GC,则比较容易实现这件事情.本篇来看下,自定义一个GC垃圾回收器. 2.概述 这里首先演示下自定义GC垃圾回收后的效果. 1.下载Custo ...
- 【Unity3D】消融特效
1 前言 选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢 ...
- Pandas 读取Eexcel - 间隔N行,读取某列数据
间隔N行,读取某列数据 import pandas as pd def read_vertical(sheet_name, col_idx, gap): """ 竖着读数 ...