前言

因为本人尚菜,所以本篇文章没有什么数学符号,请大家放心食用。

题目分析

先吐槽一嘴,这个 o 表示 (),这个 x 表示 )(,十分形象。

好,我们先观察原序列,容易得出第一条性质:

ox 的加入不会让我们不合法的序列变合法,相反,它会让我们合法的序列变不合法。

于是可以得出,无论如何,只要我们想要得到合法的序列,我们肯定都要先将去除 ox 的括号序列变得合法。

那么惯性的思考下去,也就是我们可以将贡献拆开算,分别是忽略 ox 后的括号序列变合法的最小步数ox 步数的平衡

这个时候可能会晕的一点是,为什么可以这么拆,或者说,为什么计算最小步数的时候可以忽略中间的 ox。其实,我们并没有忽略掉我们的 ox,只不过我们运用了两个视角来计算同一件事请而已,我们先忽略 ox 从纯括号中观察得到纯括号序列的移动步数,然后再从 ox 的角度观察序列的变化。此时不但得出,对于 ox 来说,我们的变化就是原序列经过变换后的逆序对数。

然后最后一步进行 dp 就是比较朴素的,设 \(dp_{i,j}\) 为已经观察了 \(i\) 个括号和 \(j\) 个序列后,我们观察出的最小步数。

然后需要特殊考虑一下 x 的位置,不难看出,x 只能在 ( 的后面。所以转移的时候需要特判。

代码实现

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

char s[MAX_SIZE];
int posb[MAX_SIZE];
int bl[MAX_SIZE];
int posv[MAX_SIZE];
int presum[MAX_SIZE];
int n, m, k;
int dp[MAX_SIZE][MAX_SIZE];
int t1[MAX_SIZE];
int t2[MAX_SIZE]; void main() {
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++){
if(s[i] == '('){
posb[++m] = i;
bl[m] = 0;
} else if(s[i] == ')'){
posb[++m] = i;
bl[m] = 1;
} else {
posv[++k] = i;
}
}
int now = 0;
int ans1 = 0;
for(int i=1;i<=m;i++){
if(bl[i] && !now){
int j=i;
while(bl[j]){
++j;
}
ans1 += j-i;
while(j>i){
swap(bl[j],bl[j-1]);
swap(posb[j],posb[j-1]);
--j;
}
}
now += (bl[i] ? -1 : 1);
presum[i] = now;
}
memset(dp,0x7f,sizeof(dp));
dp[0][0] = 0;
for(int i=0;i<=m;i++){
for(int j=0;j<=k;j++){
if(i<m){
if(j){
t1[i] += (posv[j] > posb[i+1]);
}
dp[i+1][j] = min(dp[i+1][j],dp[i][j] + t1[i]);
}
if(j<k){
if(i){
t2[j] += (posb[i] > posv[j+1]);
}
if(presum[i]>0 || s[posv[j+1]]=='o'){
dp[i][j+1] = min(dp[i][j+1],dp[i][j] + t2[j]);
}
}
}
}
printf("%lld\n",dp[m][k]+ans1);
return void();
}

题解 AGC054D的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. JDK源码-StringJoiner源码分析

    背景 功能描述:将多个元素使用指定符号前后连接为字符串:eg:1 2 3 4 5 , => 1,2,3,4,5 要点: 多个元素 指定分隔符 分隔符只在元素之间,不能作为第一或最后一个 使用方法 ...

  2. DateTime和DateTimeOffset是同胞兄弟吗?

    小编在日常开发中,用得最多的时间类型就是DateTime,直到一次偶然的邂逅,让小编遇见了DateTimeOffset.当时小编也是一脸迷茫,因为在小编的C#编程字典里就没出现过DateTimeOff ...

  3. 用python selenium提取网页中的所有<a>标签中的超级链接地址

    urls = driver.find_elements_by_xpath("//a") for url in urls: print(url.get_attribute(" ...

  4. 本地连接阿里云上的mysql centos

    首先写下原因: 未让3306端口通过防火墙 1.  检查端口是否被防火墙挡住 telnet ip地址 3306 在windows中打开telnet应用, 参考:https://www.cnblogs. ...

  5. FlinkSQL类型系统

    类型有什么作用, 类型可以提供编译期检查, 避免到运行期才报错. 类型 首先Flink中自己定义了一套类型, 有LogicalType和DataType两个表示 LogicalType Logical ...

  6. 【译】IntelliJ IDEA 2023.2 最新变化——JetBrains IDE 中的 AI 助手

    前言 本周所有基于 IntelliJ 的 IDE 和 .NET 工具的 EAP 版本都包含一个主要新功能:AI Assistant.本博文重点介绍我们基于 IntelliJ 的 IDE,并且即将推出专 ...

  7. docker搭建dvwa靶场

    查看有哪些DVWA镜像 docker search dvwa 这里选择拉取第一个镜像 docker pull citizenstig/dvwa 访问 https://hub.docker.com/ 搜 ...

  8. Row Major

    Smiling & Weeping ----昨天, 别人在我身旁大声说出你的名字, 这对于我, 像从敞开的窗口扔进了一朵玫瑰花. 思路:不客气地说,这是一道令人费解的题目,要求构造一个字符串, ...

  9. HTML一键打包APK工具1.9.5更新,新增一机一码功能

    HMTL网址打包APK,可以把本地HTML项目, Egret游戏,网页游戏,或者网站打包为一个安卓应用APK文件,无需编写任何代码,也无需配置安卓开发环境,支持在最新的安卓设备上安装运行. 打包软件会 ...

  10. ATtiny88初体验(七):TWI

    ATtiny88初体验(七):TWI TWI模块介绍 ATtiny88的TWI模块兼容Phillips I2C以及SMBus,支持主从模式,支持7bit地址,最大允许128个不同的从机地址.在多主机模 ...