题目链接:

http://acm.hust.edu.cn/vjudge/contest/122094#problem/H

Frosh Week

Time Limit:8000MS
Memory 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

2

sample 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 逆序对统计的更多相关文章

  1. 51nod1779 逆序对统计

    1779 逆序对统计 基准时间限制:1 秒 空间限制:131072 KB  lyk最近计划按顺序做n道题目,每道题目都分为很多分数档次,lyk觉得这些题太简单了,于是它想到了一个好玩的游戏. lyk决 ...

  2. [hdu5225]逆序对统计

    题目:给定一个1到n的排列,求字典序小于这个排列的所有排列的逆序对数之和. 思路:既然是求字典序小于这个排列的,不妨将排列根据和它前k位相同来分类,然后枚举第k+1位的数(小于原序列第k+1位的数), ...

  3. 51nod 1779逆序对统计(状压DP)

    按照插入数的大小排序, 然后依次进行dp. 用一个状态表示n个数是否被选了 10110 就是表示第1.3.4个位置都选了 那么如果此时这个数该填到5这个位置,那么必定会造成一个逆序(因为下一个数会填到 ...

  4. SPOJ COWPIC(逆序对变形题)

    SPOJ COWPIC 题目链接 题意:一个序列,相邻能够交换.问最少交换几次使得变成循环的1-n的当中一种 思路:对于原来正常的变换成1-n而言,答案就是逆序对了,而多了这么一个变形,事实上仅仅须要 ...

  5. 逆序对 -- cogs1438 火柴排队

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vimiQkqjU [题目描述] 样例一输入: 4 2 3 1 4 3 2 1 4 样例二 ...

  6. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

  7. HDU 3743 Frosh Week(归并排序求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...

  8. 紫书 习题 8-20 UVa 1620 (找规律+求逆序对)

    这道题看了半天没看出什么规律, 然后看到别人的博客, 结论是当n为奇数且逆序数为奇数的时候 无解, 否则有解.但是没有给出证明, 在网上也找到详细的证明--我也不知道是为什么-- 求逆序对有两种方法, ...

  9. 【CQOI2011】动态逆序对 BZOJ3295

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

随机推荐

  1. Cocos2d-JS特效

    Cocos2d-JS提供了很多特效,这些特效事实上属于间隔动作,特效类cc.GridAction类,也称为网格动作,它的类图如下图所示. 网格动作类图 网格动作cc.GridAction它有两个主要的 ...

  2. C# 谈Dictionary<TKey,TValue>,SortedDictionary<TKey,TValue>排序

    使用过Dictionary的人都知道,当每一个Add里面的值都不会改变其顺序,所以需要需要对其排序的时候就用到SortedDictionary, 但SortedDictionary并不是那么理想,其默 ...

  3. 20150410---GridView分页(备忘)

    GridView自带分页功能,但是模板单一,试用较少数据. AllowPaging="true" PageSize="10" 启用分页设置.默认每页数量为10 ...

  4. Angular2中的metadata(元数据)

    @Attrubute() 从host element 中获得普通(不是@Input)属性对应的值 适用于组件嵌套或指令, 从父组件向子组件传递数据 app.component.ts import {C ...

  5. node笔记——gulp修改静态文件的名字

    cmd小技巧: 1.换到下级或同等级目录 D: 2.换到上级目录 cd.. node 包管理器小技巧[以gulp为例] npm install --save-dev gulp gulp-concat ...

  6. Android四大组件之一:Activity

    介绍:活动是最基本的Android组件之一,在应用程序中,一个活动通常就是一个用户界面,每一个活动都被实现为一个独立的类,并且从活动几类中继承, 活动类将会显示由View控件组成的用户接口,并对时间E ...

  7. Winfrom皮肤样式的使用

    IrisSkin类库提供了可供我们使用的设置窗体皮肤的类,简单地说,就是给我们提供了一个皮肤引擎,通过设置皮肤引擎来达到我们想要的窗体界面. 具体的开发步骤: (1)引入IrisSkin.dll文件 ...

  8. SQL语句执行顺寻

    SQL语句执行的时候是有一定顺序的.理解这个顺序对SQL的使用和学习有很大的帮助. 1.from 先选择一个表,或者说源头,构成一个结果集. 2.where 然后用where对结果集进行筛选.筛选出需 ...

  9. 《Apache服务用户身份验证管理》RHEL6.3

    1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4. ...

  10. zedboard U盘挂载+交叉编译helloworld

    交叉编译环境见http://blog.csdn.net/xiabodan/article/details/22717175 1:编写hello.c文件 #include<stdio.h> ...