E - Sorted and Sorted


Time limit : 2sec / Memory limit : 1024MB

Score : 600 points

Problem Statement

There are 2N balls, N white and N black, arranged in a row. The integers from 1 through N are written on the white balls, one on each ball, and they are also written on the black balls, one on each ball. The integer written on the i-th ball from the left (1 i 2N) is ai, and the color of this ball is represented by a letter ci. ci = W represents the ball is white; ci = B represents the ball is black.

Takahashi the human wants to achieve the following objective:

  • For every pair of integers (i,j) such that 1 i < j N, the white ball with i written on it is to the left of the white ball with j written on it.
  • For every pair of integers (i,j) such that 1 i < j N, the black ball with i written on it is to the left of the black ball with j written on it.

In order to achieve this, he can perform the following operation:

  • Swap two adjacent balls.

Find the minimum number of operations required to achieve the objective.

Constraints

  • 1 N 2000
  • 1 ai N
  • ci = W or ci = B.
  • If i j, (ai,ci) (aj,cj).

Input

Input is given from Standard Input in the following format:

N
c1 a1
c2 a2
:
c2N a2N

Output

Print the minimum number of operations required to achieve the objective.


Sample Input 1

Copy
3
B 1
W 2
B 3
W 1
W 3
B 2

Sample Output 1

Copy
4

The objective can be achieved in four operations, for example, as follows:

  • Swap the black 3 and white 1.
  • Swap the white 1 and white 2.
  • Swap the black 3 and white 3.
  • Swap the black 3 and black 2.

Sample Input 2

Copy
4
B 4
W 4
B 3
W 3
B 2
W 2
B 1
W 1

Sample Output 2

Copy
18

Sample Input 3

Copy
9
W 3
B 1
B 4
W 1
B 5
W 9
W 2
B 6
W 5
B 3
W 8
B 9
W 7
B 2
B 8
W 4
W 6
B 7

Sample Output 3

Copy
41

https://arc097.contest.atcoder.jp/tasks/arc097_c

dp[i][j]表示前(i + j)个有 i 个白的,j 个黑的,都已经排好序的代价

dpi,j = min(dp[ i − 1 ][ j ] + cost,dp[ i ][ j - 1 ] + cost)

cost是原来位置移到第(i + j)个的代价,即这段中的逆序对个数,树状数组维护即可

 #include<bits/stdc++.h>
typedef long long ll ;
#define rep(i, a, b) for (int i = a; i <= b; ++i)
using namespace std; const int MAXN = ;
const ll INF = 2e9;
int n;
int dp[MAXN][MAXN];
int a[MAXN + MAXN], c[MAXN + MAXN];
int p1[MAXN], p0[MAXN];
int t[MAXN + MAXN]; void add (int k, int d) { while (k <= n + n) { t[k] += d; k += k & -k; } }
int sum (int k) { int s = ; while (k > ) { s += t[k]; k -= k & -k; } return s; } int main() {
cin >> n;
rep(i, , n + n) {
char ch;
cin >> ch >> a[i];
if (ch == 'W') {
p0[a[i]] = i;
c[i] = ;
}
else {
p1[a[i]] = i;
c[i] = ;
}
add(i, );
}
p1[] = n + n + ;
p0[] = n + n + ;
dp[][] = ;
rep(j, , n) {
add(p1[j], -);
dp[][j] = dp[][j - ] + sum(p1[j] - );
}
rep(j, , n) add(p1[j], );
rep(i, , n) {
add(p0[i], -);
rep(j, , n) {
add(p1[j], -);
dp[i][j] = INF;
if (i) dp[i][j] = min(dp[i][j], dp[i - ][j] + sum(p0[i] - ));
if (j) dp[i][j] = min(dp[i][j], dp[i][j - ] + sum(p1[j] - ));
}
rep(j, , n) add(p1[j], );
}
cout << dp[n][n] << "\n";
return ;
}

arc 097 E - Sorted and Sorted的更多相关文章

  1. python中sorted和.sorted 、reversed和reverse的注意点

    L=[1,2,3,4]l1=[123,123,23]if l1.sort() == L.reverse():   #这个判断式是恒等的,因为两个函数的返回值都是None(其实是无返回值)    pri ...

  2. 【AtCoder】 ARC 097

    link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...

  3. python中sorted和sorted 、reversed和reverse的使用。

    #encoding = utf-8 list = [1,8,3,6] print(list.sort()) #None print(list) #[1,3,6,8] print(sorted(list ...

  4. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  5. ARC097E Sorted and Sorted

    传送门 题目 There are 2N balls, N white and N black, arranged in a row. The integers from 1 through N are ...

  6. python 中 sorted() 和 list.sort() 的用法

    今天用python自带的sorted对一个列表进行排序, 在这里总结一下 只要是可迭代对象都可以用sorted . sorted(itrearble, cmp=None, key=None, reve ...

  7. python 排序sorted

    num = [3,2,4,6,5] anum = sorted(num) dnum = sorted(num,reverse=True) print '升序:',anum # 升序: [2, 3, 4 ...

  8. Redis in .NET Core 入门:(5) Sorted SET

    第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565. ...

  9. Redis实战 - 2.list、set和Sorted Set

    List Redis的List是通过Linked List(链表)来实现的String集合,所以插入数据的速度很快. 但是缺点就是在数据量比较大的时候,访问某个数据的时间可能会很长,但针对这种情况,可 ...

随机推荐

  1. angular6 引用echart第一次数据不显示解决

    1 使用promise从后台返回数据后,页面还是比数据更快的加载出来,导致echart图页面加载的时候不显示问题 1.1 html <div echarts [options]="do ...

  2. 小妖精的完美游戏教室——人工智能,A*算法,实现篇

    //================================================================//// Copyright (C) 2017 Team Saluk ...

  3. oracle data type

    NUMBER ( precision, scale) precision表示数字中的有效位.如果没有指定precision的话,Oracle将使用38作为精度. scale表示数字小数点右边的位数,s ...

  4. 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程

    在装完DosBox环境之后,就可以用debug模式进行汇编指令的编程了. 实验内容:      首先用a指令进行数据的储存,然后用t命令进行调试. 可以发现ax,bx在不同的命令下发生了改变,cs的地 ...

  5. 转:Excel—“撤销工作表保护密码”的破解并获取原始密码

    在日常工作中,您是否遇到过这样的情况:您用Excel编制的报表.表格.程序等,在单元格中设置了公式.函数等,为了防止其他人修改您的设置或者防止您自己无意中修改,您可能会使用Excel的工作表保护功能, ...

  6. 前后端数据交互处理基于原生JS模板引擎开发

    json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...

  7. Ubuntu16.04 换阿里源

    国内阿里源速度比较快,北京联通下载极快.更新也比较稳定 1.备份 cp /etc/apt/source.list /etc/apt/source.list.bak 2.编辑source文件 sudo ...

  8. 一个简单的例子了解states

    在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...

  9. Linux----------Openssh介绍以及用法

    一.OpenSSH介绍 OpenSSH这一术语指系统中使用的Secure Shell软件的软件实施.用于在远程系统上安全运行shell.如果您在可提供ssh服务的远程Linux系统中拥有用户帐户,则s ...

  10. C#编码规范之代码的增删改约定

    增加 ,仅增加一行时可以是这样"int a = GetScale(obj, col); // 描述.add by Tome 2018-9-20",多行时见下. #region ad ...