[atAGC054D]ox
对于两个字符串$s$和$t$(保证其中每一种字符个数相同),定义$s$和$t$的相对逆序对数为$s$得到$t$的最少交换次数,显然同种字符相对顺序保持不变,因此即依次编号后的逆序对数
问题不妨看作构造合法字符串$t$使得$s$和$t$的相对逆序对数最小,定义$f_{S}(s)$为$s$仅保留$S$中的字符后所得到的字符串,那么有以下两个结论——
结论1:当$S=\{(,)\}$时,若$t$是使得$s$和$t$相对逆序对数最小的合法字符串,则$f_{S}(t)$也是使得$f_{S}(s)$和$f_{S}(t)$相对逆序对数最小的合法字符串
结论2:当$S=\{o,x\}$时,若$t$是使得$s$和$t$相对逆序对数最小的合法字符串,则$f_{S}(s)=f_{S}(t)$
由此,不妨先求出$S=\{(,)\}$时的$f_{S}(t)$,进而即将$o$和$x$从左到右依次插入,显然这可以用一个二维dp计算,条件为$x$之前左括号数严格大于右括号数,计算答案考虑逆序对数即可
时间复杂度为$o(n^{2})$,可以通过
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 8005
4 queue<int>q;
5 vector<int>vb,vc;
6 int n,cnt,ans,sum[N],f[N][N];
7 char s[N];
8 int main(){
9 scanf("%s",s+1);
10 n=strlen(s+1);
11 vb.push_back(0),vc.push_back(0);
12 for(int i=1;i<=n;i++){
13 if (s[i]=='('){
14 cnt++;
15 vb.push_back(i);
16 if (!q.empty()){
17 vb.push_back(q.front());
18 q.pop();
19 }
20 }
21 if (s[i]==')'){
22 cnt--;
23 if (cnt<0)q.push(i);
24 else vb.push_back(i);
25 }
26 if ((s[i]=='o')||(s[i]=='x'))vc.push_back(i);
27 }
28 for(int i=1;i<vb.size();i++){
29 sum[i]=sum[i-1];
30 if (s[vb[i]]=='(')sum[i]++;
31 else sum[i]--;
32 }
33 memset(f,0x3f,sizeof(f));
34 memset(f[0],0,sizeof(f[0]));
35 for(int i=1;i<vc.size();i++){
36 cnt=0;
37 for(int j=0;j<vb.size();j++)
38 if (vc[i]>vb[j])cnt++;
39 for(int j=0;j<vb.size();j++){
40 if (vc[i]<vb[j])cnt++;
41 else cnt--;
42 if ((s[vc[i]]=='o')||(sum[j]))f[i][j]=min(f[i][j],f[i-1][j]+cnt);
43 }
44 for(int j=1;j<vb.size();j++)f[i][j]=min(f[i][j],f[i][j-1]);
45 }
46 ans=0x3f3f3f3f;
47 for(int i=0;i<vb.size();i++)ans=min(ans,f[(int)vc.size()-1][i]);
48 for(int i=1;i<vb.size();i++)
49 for(int j=i+1;j<vb.size();j++)
50 if (vb[i]>vb[j])ans++;
51 printf("%d\n",ans);
52 return 0;
53 }
[atAGC054D]ox的更多相关文章
- Hrbust 2320 OX (博弈)
题目链接 Hrbust 2320 用三进制来存储整个棋盘的状态. 设$dp[status][now]$为轮到$now$下棋的时候是必胜必败还是平局. 那么若当前能延伸出的所有状态中存在必败态的,则当 ...
- -oN ,-oX,-oG
-oN ,正常输出 -oX, xml输出 nmap 192.168.9.12 -oX TEST.xml -oG grep输出 html文件可读性比xml文件要好,将xml转换成html xs ...
- 哈理工OJ P2320:OX
题目链接:OX 题意 :给出一个3X3的黑白棋棋盘,棋盘上有若干黑白子,再给出下一个下的人,问下一个下的人能否赢 分析:考虑到只有39种状态,故用一个数保存目前棋盘的状态,记为value,再枚举空位D ...
- OX中修改文件名
右击文件,显示简介,名称与扩展名
- Mac OX上安装MongoDb
MongoDB的安装有好多种安装方法,有普通青年的HomeBrew方式,也有文艺青年的源码编译方式.我只想快速的装起来用一下,所以我选最简单的HomeBrew. 请参考官方文档 : http://do ...
- Xcode与OX 版本对照表
xcode1.0-xcode2.x 版本 OS X运行版本 OS X SDK(s) 1.0 OS X Panther(10.3.x) OS X Puma(10.1.x),OS X Jaguar(10. ...
- Mac OX 隐藏文件夹,文件,应用,磁盘的2种方法 hide finder folder, file, application, volume in 2 ways
经常需要主目录下隐藏一些文件夹之类的, 第一想到的当然就是:在要隐藏的文件夹前面加『.』(leading dot),这个用法当然可以的了 用习惯了Linux/GNU系统的,基本习惯使用这种办法 但是, ...
- apache for mac OX S 10.10
mac下如何针对 apache 设置虚拟目录呢?可能很多人都设置过,但也都不太会,每次都是网上找文章啥的.这里,我自己整理了一点,希望可以帮到大家. 还原 httpd.conf 配置文件 如果,你现在 ...
- MAC OX 配置JDK环境变量
大家在windows里面配置JDK环境变量很容易,但是如果要在mac里面配置JDK环境变量和windows里面有所不同,具体如下: 第一: mac OS里面自带jdk,不过是1.6的版本,现在很多人使 ...
随机推荐
- react之组件数据挂在方式
1.属性(props) 组件间传值,在React中是通过只读属性 props 来完成数据传递的. props:接受任意的入参,并返回用于描述页面展示内容的 React 元素. import React ...
- 关于 Binomial Coefficient is Fun
题目传送门 Solution 应该这个做法不是很常见吧. 我们设 \(f_{i,j}\) 表示前面 \(i\) 个数,选出的数和为 \(j\) 的贡献之和.因为我们有以下式子: \[\sum_{i=a ...
- wqs二分 学习笔记
wqs二分学习笔记 wqs二分适用题目及理论分析 wqs二分可以用来解决这类题目: 给你一个强制要求,例如必须\(n\)条白边,或者划分成\(n\)段之类的,然后让你求出最大(小)值.但是需要满足图像 ...
- UF_CAMGEOM_ask_custom_points 封装缺陷
如果当前设置为0个点时,取自定义点就会报错,这又是一个封装错误 解决办法,只能是这么搞了:
- Windows 安装 gcc
Windows 安装 gcc ① 官网下载 GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF ...
- eclipse javase版安装插件开发web项目
最近学习开发javaweb,但是安装的却是java se版的eclipse,但其无法新建web项目,即找不到Dynamic Web.所以需要下载相应插件.以下为操作过程. 1. 在联网的情况下,打开e ...
- Python课程笔记(四)
1.模块的导入 相当于Java的包或C语言的头文件 (1) import math s = math.sqrt(25) print(s) (2) from math import sqrt s=mat ...
- UVM RAL模型和内置seq
转载:UVM RAL模型:用法和应用_寄存器 (sohu.com) 在系统设计中通常会面临两大挑战:缩小技术节点的规模和上市时间(TTM,Time to Market).为了适应激烈的市场竞争,大多数 ...
- 把字符串转换成整数 牛客网 剑指Offer
把字符串转换成整数 牛客网 剑指Offer 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串 ...
- hdu 4521 小明序列(线段树,DP思想)
题意: ①首先定义S为一个有序序列,S={ A1 , A2 , A3 , ... , An },n为元素个数 : ②然后定义Sub为S中取出的一个子序列,Sub={ Ai1 , Ai2 , Ai3 , ...