bzoj2789.Letters(贪心 && 逆序数)
来源:互联网 发布:新顶级域名有哪些 编辑:程序博客网 时间:2024/06/05 15:14
有两个长度为 n 的由大写英文字母组成的字符串A, B,问最少需要多少次交换( 相邻两个交换 )才能使 A 变为 B ( 保证可以实现 )
首先的一个想法就是:要想总交换次数最小,A , B 中的相同字母要相距的距离最小( 贪心 )。然后就可以根据 A 中每个字母的位置, 把 B 对应成一个序列,求这个序列的逆序数。
/*Author: JDDPROG: bzoj2789.lettersDATE: 2015.11.03*/#include <cstdio>#include <queue>using namespace std;const int MAX_N = 1000005;#define low(x) (x & (-x))int n, c[MAX_N];queue<int> q[30];void insert(int x, int p){for(int i = x; i <= n; i += low(i))c[i] += p;}int query(int x){int ret = 0;for(int i = x; i > 0; i -= low(i))ret += c[i];return ret;}void init(){scanf("%d", &n);char s[MAX_N]; scanf("%s", s + 1);for(int i = 1; i <= n; i ++)q[s[i] - 'A' + 1].push(i); }void doit(){char s[MAX_N]; scanf("%s", s + 1);long long ans = 0;for(int i = 1; i <= n; i ++){int p = q[s[i] - 'A' + 1].front(); q[s[i] - 'A' + 1].pop();insert(p, 1);ans += i - query(p);}printf("%lld\n", ans);}int main(){freopen("1.in", "r", stdin);init(); doit();return 0;}
0 0
- bzoj2789.Letters(贪心 && 逆序数)
- [BZOJ2789][Poi2012]Letters(树状数组求逆序对)
- 【POI2012】【BZOJ2789】Letters
- BZOJ2789: [Poi2012]Letters
- BZOJ2789: [Poi2012]Letters
- 【bzoj2789】 [Poi2012]Letters
- bzoj2789 letters 树状数组
- 【bzoj2789】[Poi2012]Letters
- BZOJ2789 逆序对
- 【BZOJ2789】【树状数组】[Poi2012]Letters 题解
- 【BZOJ】【P2789】【Poi2012】【Letters】【题解】【逆序对】
- bzoj 2789 [Poi2012]Letters 求逆序对
- LeetCode 316 Remove Duplicate Letters(贪心)
- LeetCode 316 Remove Duplicate Letters (队列+贪心)
- LeetCode316.Remove Duplicate Letters--贪心算法
- LeetCode 316. Remove Duplicate Letters--贪心算法
- 逆序数 & 逆序对
- 逆序数
- mysql 远程账户
- How do I get started with CUDA?
- 在不同的Activity之间传递数据--摘自《android开发权威指南.pdf》
- 美国的经济学教育是怎样的?培养经+就业路
- Android开发环境配置中的名词解释
- bzoj2789.Letters(贪心 && 逆序数)
- android之Picasso加载图片用法以及Transformation自定义加载图片
- jquery插件scroll-loading实现的图片延迟加载
- chosen插件--(三)让插件作用过的select,disabled.
- 数据库的隔离级别
- java中的jar命令与jar包
- java日志处理组件log4j--log4j.xml配置详解
- Android实战技巧之四十四:Hello,Native!
- GIT用法