题意

给你长度为 \(n\) 的两个排列 \(A,B\) 组成的序列,求最少的交换相邻数字的次数使得 \(A,B\) 分别有序。

\(n\leq 2000\) .

分析

  • 如果只有一个排列时最少交换次数为逆序对数,方案可从小到大枚举数字 \(a_i\),并向左移动直到前面的数有序且没有比 \(a_i\)大的数为止。

  • 发现当前序列的每个数字仍然会按照上述方式交换,否则逆序对仍要交换且还有多余的部分。

  • 只是两个序列的错杂交换会相互影响,于是考虑定义状态 \(f_{i,j}\) 表示 \(A\) 序列的前 \(i\) 个有序,\(B\) 序列的前 \(j\) 个有序(一定占据了前 \((i+j)\) 个位置)最小的交换次数。每次枚举是哪一边交换并查询还需要和前面的多少个元素交换即可。

  • 总时间复杂度为 \(O(n^2logn)\)。

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=4004 + 7,inf=0x3f3f3f3f;
int n;
int a[2][N],tr[N],f[N][N];
char s[10];
int lowbit(int x){return x&-x;}
void modify(int x,int y){for(int i=x;i<=2*n;i+=lowbit(i)) tr[i]+=y;}
int query(int x){int res=0;for(int i=x;i;i-=lowbit(i)) res+=tr[i];return res;}
int main(){
n=gi();
rep(i,1,2*n){
int x;
scanf("%s%d",s,&x);
a[s[0]=='W'][x]=i;
modify(i,1);
}
a[0][0]=a[1][0]=2*n+1;
memset(f,0x3f,sizeof f);
f[0][0]=0;
rep(i,0,n){
modify(a[0][i],-1);
rep(j,0,n){
modify(a[1][j],-1);
if(i||j){
if(i) Min(f[i][j],f[i-1][j]+query(a[0][i]-1));
if(j) Min(f[i][j],f[i][j-1]+query(a[1][j]-1));
}
}
rep(j,0,n) modify(a[1][j],1);
}
printf("%d\n",f[n][n]);
return 0;
}

牛客OI周赛3-提高组-B-1408[dp]的更多相关文章

  1. 牛客OI周赛9-提高组题目记录

    牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...

  2. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  3. 牛客OI周赛2-提高组

    A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  4. 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)

    链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...

  5. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

  6. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  7. 牛客OI周赛7-普及组 解题报告

    出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...

  8. 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)

    https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...

  9. 牛客OI周赛8-普及组

    https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...

  10. 牛客OI周赛7-提高组

    https://ac.nowcoder.com/acm/contest/371#question A.小睿睿的等式 #include <bits/stdc++.h> using names ...

随机推荐

  1. swift关于UIView设置frame值的extension

    swift关于UIView设置frame值的extension 使用 说明 1. 使用如上图,很简单,不再赘述 2. 在extension给添加的计算属性提供getter,setter方法即可 源码 ...

  2. Linux wc命令详解

    wc常见命令参数 wc -l : 统计行 wc -c: 统计字节数 wc -m:统计字符数,不能与-c同时使用 wc -w:统计字数 wc -L:打印最长长度 注意: wc 可以直接后面跟文件使用,但 ...

  3. 铁乐学python_Day43_协程

    铁乐学python_Day43_协程 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位. 按道理来说我们已经算是把cpu的利用率提高很多了. ...

  4. 铁乐学python_Day40_进程池

    进程之间的数据共享 基于消息传递的并发编程是大势所趋, 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁和其他同步手段的需求,还可以扩展到分 ...

  5. 企业生产环境集群稳定性-HA就行吗?

    在企业生产中,集群一旦运行,是要尽可能的将损失降到最低,现在所有的大数据技术都有HA,spark的.Hadoop的.HBase的等等, HA分冷备和热备,热备是集群自带的,冷备就是硬件的. 这样一种情 ...

  6. gp数据库停止

    greenplum是2(master)+7(segment)的集群规模 系统刚准备上线,是用来做统计数据库的,正在帮忙一个hadoop集群核对其数据的准确性,在这个greenplum库中入了清单数据 ...

  7. 1415. [NOI2005]聪聪和可可【记忆化搜索DP】

    Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点 ...

  8. 搭建高可用mysql系列(1)-- Percona XtraDB Cluster介绍

    Percona XtraDB Cluster (下文简称PXC)是一个开源的mysql 高可用解决方案.它将Percona Server和Percona XtraBackup与Galera库集成在一起 ...

  9. 【2015蓝桥杯省赛】C++ B组试题

    1.奖券数目 作答:52488,正确 #include <iostream> using namespace std; bool check(int x) { ] = { }; while ...

  10. 20145203 盖泽双《Java程序设计》第一周的学习总结

    20145203 盖泽双<Java程序设计>第一周学习总结 教材学习内容总结 第一章 1.Java是一门完全面向对象,安全可靠,与平台无关的编程语言. 2.Java现由Java SE.Ja ...