题解 AGC054D
前言
因为本人尚菜,所以本篇文章没有什么数学符号,请大家放心食用。
题目分析
先吐槽一嘴,这个 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的更多相关文章
- 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 ...
随机推荐
- Java并发工具CountDownLatch的使用和原理
1.等待多线程完成的 CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作. 假如有这样一个需求:我们需要解析一个 Excel 里多个 sheet 的数据 ...
- 虚拟化学习:vps和云计算的区别
1 vps 可以由虚拟机实现,但并不是虚拟机; 虚拟机是云计算的核心,但虚拟机也不等于云主机. 2 vps是面向单台服务器的虚拟化技术,服务器挂了,其上的vps也跟着挂了. 3 云计算是面向服务器集群 ...
- 使用调试工具调试博图TCP连接所遇到的问题
PLC端使用的指令 PLC为服务器端,电脑为客户端,以上为服务器与客户端的配置参数 启动连接后连接成功,PLC的IP地址也可以ping通 ------------------------------- ...
- 你真的知道吗?catch、finally和return哪个先执行
我的一位朋友前阵子遇到一个问题,问题的核心就是try--catch--finally中catch和finally代码块到底哪个先执.这个问题看起来很简单,当然是"catch先执行.final ...
- SpringBoot对接OpenAI
SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能.OpenAI作为一家领先的人工智能公司,提供了许多先进的 ...
- CentOS7更新OpenSSH
前言 整个过程不要断开ssh链接,如有必要可使用telnet远程操作. 系统版本:centos 7.9 OpenSSL版本:1.0.2k -> 1.1.1q OpenSSH版本:7.4p1 -& ...
- [golang]使用gocron编写定时任务
前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务.当然,也不是不行,比如: * * * * * for i in $(seq 1 11);do echo hello &g ...
- 「Go笔记-02」变量、数据类型、数据类型间转换、进制转换...看这一篇就Go了
前言 一个程序就是一个世界,不论是使用哪种高级程序语言编写程序, 变量都是其程序的基本组成单位, 变量 在 go 中 变量是用于存储数据的命名空间(内存位置),它可以表示一个值,这个值在程序执行过程中 ...
- Lithosphere是什么,它解决什么问题?
这问题很好,一针见血,它解决什么问题? 那这得说说,在IoT应用中,我们会碰到什么问题? 和纯软件项目,互联网项目比,IoT应用项目一个比较大不同的地方,应该是它既要做软件,又要做硬件. 我并不是硬件 ...
- 8.0 Python 使用进程与线程
python 进程与线程是并发编程的两种常见方式.进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间.资源.优先级等属性.线程是进程中的一条执行路径,可以看做是轻量 ...