UVA 11858 Frosh Week 逆序对统计
题目链接:
http://acm.hust.edu.cn/vjudge/contest/122094#problem/H
Frosh Week
Time Limit:8000MSMemory Limit:0KB
#### 问题描述
> During Frosh Week, students play various fun games to get to know each other and compete against other teams. In one such game, all the frosh on a team stand in a line, and are then asked to arrange themselves according to some criterion, such as their height, their birth date, or their student number. This rearrangement of the line must be accomplished only by successively swapping pairs of consecutive students. The team that finishes fastest wins. Thus, in order to win, you would like to minimize the number of swaps required.
>
#### 输入
> Input contains several test cases. For each test case, the first line of input contains one positive integer n, the number of students on the team, which will be no more than one million. The following n lines each contain one integer, the student number of each student on the team. No student number will appear more than once.
#### 输出
> For each test case, output a line containing the minimum number of swaps required to arrange the students in increasing order by student number.
样例
sample input
3
3
1
2sample output
2
题意
题目其实就是叫你求逆序对的个数
题解
1、数状数组+离散化
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 10;
typedef long long LL;
LL sumv[maxn];
int arr[maxn],ha[maxn];
int n;
void add(int x, int v) {
while (x <= n) {
sumv[x] += v;
x += (x&-x);
}
}
LL sum(int x) {
LL ret = 0;
while (x > 0) {
ret += sumv[x];
x -= (x&-x);
}
return ret;
}
void init() {
memset(sumv, 0, sizeof(sumv));
}
int main() {
while (scanf("%d", &n) == 1 && n) {
init();
LL ans = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
ha[i] = arr[i];
}
sort(ha, ha + n);
for (int i = 0; i < n; i++) {
int id = lower_bound(ha, ha + n, arr[i]) - ha + 1;
ans += sum(n) - sum(id);
add(id,1);
}
printf("%lld\n", ans);
}
return 0;
}
2、分治(归并排序)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 10;
int n;
int arr[maxn];
int tmp[maxn];
LL solve(int l, int r) {
if (l == r) return 0;
int mid = l + (r - l) / 2;
LL ret = 0;
ret += solve(l, mid);
ret += solve(mid + 1, r);
int p = l, p1 = l, p2 = mid + 1;
while (p <= r&&p1 <= mid&&p2 <= r) {
if (arr[p1] < arr[p2]) {
tmp[p++] = arr[p1];
//ret += p2 - mid - 1;
p1++;
}
else {
tmp[p++] = arr[p2];
//这里相当于枚举右边的每个元素计算左边比它大的有多少个。
ret += mid - p1 + 1;
p2++;
}
}
if (p1 > mid) {
while (p2 <= r) tmp[p++] = arr[p2],p2++;
}
else if (p2 > r) {
//ret += (mid - p1 + 1)*(r - mid);
while (p1 <= mid) tmp[p++] = arr[p1],p1++;
}
//printf("(%d,%d):%d\n", l, r, ret);
for (int i = l; i <= r; i++) arr[i] = tmp[i];
return ret;
}
int main() {
while (scanf("%d", &n) == 1 && n) {
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
LL ans = solve(0, n - 1);
//for (int i = 0; i < n; i++) printf("%d ", arr[i]);
//puts("");
printf("%lld\n", ans);
}
return 0;
}
UVA 11858 Frosh Week 逆序对统计的更多相关文章
- 51nod1779 逆序对统计
1779 逆序对统计 基准时间限制:1 秒 空间限制:131072 KB lyk最近计划按顺序做n道题目,每道题目都分为很多分数档次,lyk觉得这些题太简单了,于是它想到了一个好玩的游戏. lyk决 ...
- [hdu5225]逆序对统计
题目:给定一个1到n的排列,求字典序小于这个排列的所有排列的逆序对数之和. 思路:既然是求字典序小于这个排列的,不妨将排列根据和它前k位相同来分类,然后枚举第k+1位的数(小于原序列第k+1位的数), ...
- 51nod 1779逆序对统计(状压DP)
按照插入数的大小排序, 然后依次进行dp. 用一个状态表示n个数是否被选了 10110 就是表示第1.3.4个位置都选了 那么如果此时这个数该填到5这个位置,那么必定会造成一个逆序(因为下一个数会填到 ...
- SPOJ COWPIC(逆序对变形题)
SPOJ COWPIC 题目链接 题意:一个序列,相邻能够交换.问最少交换几次使得变成循环的1-n的当中一种 思路:对于原来正常的变换成1-n而言,答案就是逆序对了,而多了这么一个变形,事实上仅仅须要 ...
- 逆序对 -- cogs1438 火柴排队
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vimiQkqjU [题目描述] 样例一输入: 4 2 3 1 4 3 2 1 4 样例二 ...
- UVA 11990 ``Dynamic'' Inversion 动态逆序对
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...
- HDU 3743 Frosh Week(归并排序求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...
- 紫书 习题 8-20 UVa 1620 (找规律+求逆序对)
这道题看了半天没看出什么规律, 然后看到别人的博客, 结论是当n为奇数且逆序数为奇数的时候 无解, 否则有解.但是没有给出证明, 在网上也找到详细的证明--我也不知道是为什么-- 求逆序对有两种方法, ...
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()
一.sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007 ...
- Objective-C 【Category-非正式协议-延展】
------------------------------------------- 类别(Category)的声明和实现 实质:类别又叫类目,它其实是对类的一个拓展!但是他不同于继承后的拓展! ...
- 20141109--SQL 练习题-1
create database xinxiku go use xinxiku go create table Student ( Sno ) primary key, Sname ) not null ...
- AMQ学习笔记 - 13. Spring-jms的配置
概述 如何使用spring-jms来简化jms客户端的开发? 这篇文章主要记录如何配置以便以后复用,而非原理的讲解,有些内容我 没有掌握原理. producer端 producer端负责发送,这里使用 ...
- CSS学习备忘
CSS样式控制行间距,用line-height 测试一下: <div style="line-height:6px"> 111<br> 222<br& ...
- 真正明白C语言二级指针(转载)
指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的“值,结果传递”等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的 ...
- Speeding up AngularJS apps with simple optimizations
AngularJS is a huge framework with that already has many performance enhancements built in, but they ...
- PHP性能分析
内容来自以下站点整理http://jingyan.baidu.com/article/ff4116257e0d5112e48237a0.html关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言 ...
- 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配
今天在使用plsql通过odbc导入excel数据时发生了一个错误,截图如下: 错误提示为:驱动程序和应用程序之间的体系结构不匹配. 后来百度了一下,得出答案.系统是win10 64位.excel驱动 ...
- jQuery 遍历用法
jQuery 遍历 DOM 树 parent() 方法返回被选元素的直接父元素(找爸爸). parents() 方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (找长辈). parents ...