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个元素,你的任务是在每次删除一个元素之前统计 ...
随机推荐
- EXT中的iconCls 图标加载
刚刚遇到了个奇怪的问题. 我用 在主页面用TAB autoLoad:{url:link, nocache: true, scripts:true} 加载页面Student.jsp, 郁闷,FF可以正常 ...
- Codevs 2875 RY哥查字典
时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题目描述 Description RY哥最近新买了一本字典,他十分高兴,因为这上面的单词都十分的和谐,他天天 ...
- Linux 内核同步机制
本文将就自己对内核同步机制的一些简要理解,做出一份自己的总结文档. Linux内部,为了提供对共享资源的互斥访问,提供了一系列的方法,下面简要的一一介绍. Technorati 标签: ...
- C++ 实现不能被继承的类
方法一: #include <iostream> using namespace std; class A { public: static A* getInstance(); stati ...
- UILabel常用属性
[super viewDidLoad]; // 实例化UILabel并指定其边框 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0 ...
- SequoiaDB数据库的一般概念介绍
SequoiaDB数据库的主要对象包括文档.集合.集合空间与索引等. 文档 SequoiaDB中的文档为JSON格式,一般又被称为记录.在数据库内部使用BSON,即二进制的方式存放JSON数据.一般情 ...
- 分享:perl 文件操作总结
发布:thebaby 来源:net [大 中 小] perl 文件操作,包括打开.关闭文件,读取.定入文件等.原文链接:http://www.jbxue.com/article/3153.html 打 ...
- ADO.NET的五个主要对象
优秀文章链接:http://www.cnblogs.com/xianspace/archive/2009/02/21/1395307.html http://www.cnblogs.com/aito/ ...
- openerp经典收藏 深入理解工作流(Workflow)(转载)
深入理解工作流(Workflow) 原文:http://shine-it.net/index.php/topic,2494.0.html 一.工作流定义:<?xml version=" ...
- django_auth_ldap
使用django_auth_ldap来实现ldap和django自己的认证系统auth 下载插件 python-ldap和django_auth_ldap 配置settings.py 一些基本说明: ...