Bzoj 2789: [Poi2012]Letters 树状数组,逆序对
2789: [Poi2012]Letters
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 278 Solved: 185
[Submit][Status][Discuss]
Description
给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。
现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。
Input
第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度。
第二行和第三行各一个长度为n的字符串,并且只包含大写英文字母。
Output
Sample Input
ABC
BCA
Sample Output
HINT
Source
题解:
树状数组+逆序对
口胡 :Bzoj好像挂了QAQ,好伤心555555
好了,开始说正题。
首先,最少次数交换相邻的元素之类的肯定用树状数组求逆序对。然后考虑贪心。
这道题的贪心思路很好想,就是把B数列每个数把其在A数列中最近的数移过来。
例如:
A数列 : ABACA
B数列 : ABCAA
对于B数列中每个数,我们去找在A数列中应该出现的位置,若字母相同就往后找,直到找到第一个没有在A数列中选过的位置。
则上述例子可以得到数列:1 2 4 3 5
然后逆序对胡搞。。。
具体看程序,自己手推一下就懂了 ^w^
PS:把int变量定到char类型中也是爽。。。QAQ
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define MAXN 1000010
struct node
{
int v,w;
}a[MAXN],b[MAXN];
/*struct NODE
{
int v,w;
}b[MAXN];*/
int n;
int BIT[MAXN],c[MAXN];
char A[MAXN],B[MAXN];
bool cmp(node aa,node bb)
{
if(aa.v==bb.v)return aa.w<bb.w;
return aa.v<bb.v;
}
/*bool cmp1(NODE aa,NODE bb)
{
if(aa.v==bb.v)return aa.w<bb.w;
return aa.v<bb.v;
}*/
int Lowbit(int o){return o&(-o);}
void Update(int o,int o1)
{
while(o<=n)
{
BIT[o]+=o1;
o+=Lowbit(o);
}
}
int Sum(int o)
{
int sum=;
while(o>)
{
sum+=BIT[o];
o-=Lowbit(o);
}
return sum;
}
int main()
{
int i;
LL ans=;
scanf("%d",&n);
scanf("\n%s\n%s",A+,B+);
for(i=;i<=n;i++)
{
a[i].v=A[i]-'A'+;b[i].v=B[i]-'A'+;
a[i].w=b[i].w=i;
}
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp);
for(i=;i<=n;i++)c[a[i].w]=b[i].w;
memset(BIT,,sizeof(BIT));ans=;
for(i=n;i>=;i--)
{
ans+=Sum(c[i]-);
Update(c[i],);
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return ;
}
Bzoj 2789: [Poi2012]Letters 树状数组,逆序对的更多相关文章
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- 【bzoj2789】[Poi2012]Letters 树状数组求逆序对
题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...
- 【BZOJ2789】[Poi2012]Letters 树状数组
[BZOJ2789][Poi2012]Letters Description 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符 ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 52306 Accepted: 19194 ...
- hdu 2838 Cow Sorting (树状数组+逆序对)
题目 题意:给你N个排列不规则的数,任务是把它从小到大排好,每次只能交换相邻两个数,交换一次的代价为两数之和,求最小代价 拿到这道题,我根本看不出这道题和树状数组有半毛钱关系,博客之,全说用树状数组做 ...
随机推荐
- The Wonderful Wizard of Oz-绿野仙踪-(音频+文本)-英文版本
Audio: http://www.booksshouldbefree.com/book/the-wonderful-wizard-of-oz Books: http://www.gutenberg. ...
- tomcat内存溢出问题
内存泄露java.lang.OutOfMemoryError: PermGen space解决办法 今天访问web服务器,tomcat服务就瘫痪了,通过查看日志,发现java.lang.OutOfMe ...
- Nginx(一)初始环境的安装(php5.3+mysql5.1+fastcgi…)
关参考资源http://www.lnmp.org/index.html \\LNMP一键安装包http://www.howtocn.org/nginx \\Nginx模块参考手册中文版http://b ...
- css盒子模型、文档流、相对与绝对定位、浮动与清除模型
一.CSS中的盒子模型 标准模式和混杂模式(IE).在标准模式下浏览器按照规范呈现页面:在混杂模式下,页面以一种比较宽松的向后兼容的方式显示.混杂模式通常模拟老式浏览器的行为以防止老站点无法工作. h ...
- jsonp多次请求报错 not a function的解决方法
添加时间戳给callbackId $.ajax({ type: "get", url: url, timeout: 6000, data: param, cache: false, ...
- 动画讲解 Eclipse 常用快捷键
Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 小坦克我花了一整天时间, 精选了一些常用的快捷键操作,并且精心录制了动画, 让你一看就会. ...
- CAGradientLayer的一些属性解析-b
CAGradientLayer的一些属性解析 iOS中Layer的坐标系统: 效果: - (void)viewDidLoad { [super viewDidLoad]; CAGradientLaye ...
- python中self.__class__
1. python中的self python中的self就相当于C++中的this指针也就是指向对象本身的指针self.name = name 就是当前对象的成员变量name赋值为name. 2.py ...
- Stanford Parser学习入门(3)-标记
以下是Stanford parser中的标记中文释义供参考. probabilistic context-free grammar(PCFG) ROOT:要处理文本的语句 IP:简单从句 NP ...
- OneAlert 入门(四)——事件分派和通知必达
OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...