51nod 1019 逆序数
收起
输入
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
输出
输出逆序数
输入样例
4
2
4
3
1
输出样例
4
试了一下,这道题应该给的是互不相同的n个数。
归并排序合并过程来完成。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAX 50000
#define DMAX 10000
using namespace std; int n,ar[MAX],ans;
void merge_sort(int l,int r) {
if(l == r) return;
int mid = (l + r) / 2;
merge_sort(l,mid);
merge_sort(mid + 1,r);
int *p = new int[r - l + 1];
int a = l,b = mid + 1,i = 0;
while(a <= mid || b <= r) {
if(b > r || a <= mid && ar[a] < ar[b]) {
p[i ++] = ar[a ++];
}
else {
p[i ++] = ar[b ++];
ans += mid - a + 1;
}
}
for(int i = l;i <= r;i ++) {
ar[i] = p[i - l];
}
}
int main() {
scanf("%d",&n);
for(int i = 0;i < n;i ++) {
scanf("%d",&ar[i]);
}
merge_sort(0,n - 1);
printf("%d",ans);
}
也可以用树状数组来实现。因为数很大,数组下标不能装,但是总的n个数,数组下标还是可以装的,所以把数用map映射到1-n,排好序之后,按照映射的下标排着找逆序数,注意这个时候的逆序数实际上是原来未排序时原来序列的正序数,所以用(n - 1) * n / 2减去就是答案。也可以存一下原序列,排序后再映射,然后按照原序列插入树状数组来计算。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#define MAX 50000
#define DMAX 10000
using namespace std;
typedef long long ll;
int n,ar[MAX];
ll ans;
int sum[MAX + 1];
map<int,int> mp;
int lowbit(int t) {return t&-t;}
void update(int x) {
while(x <= n) {
sum[x] ++;
x += lowbit(x);
}
}
int getsum(int x) {
int c = 0;
while(x > 0) {
c += sum[x];
x -= lowbit(x);
}
return c;
}
int main() {
scanf("%d",&n);
ans = (ll)(n - 1) * n / 2;
for(int i = 0;i < n;i ++) {
scanf("%d",&ar[i]);
mp[ar[i]] = i + 1;
}
sort(ar,ar + n);
for(int i = 0;i < n;i ++) {
ans -= getsum(mp[ar[i]] - 1);
update(mp[ar[i]]);
}
printf("%lld",ans);
}
51nod 1019 逆序数的更多相关文章
- 51nod 1019 逆序数(逆序数+离散化)
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是 ...
- 51Nod 1019 逆序数(线段树)
题目链接:逆序数 模板题. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a) ...
- (分治)51NOD 1019 逆序数
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是 ...
- 51Nod 1019 逆序数 (归并排序)
#include <iostream> #include <cstring> using namespace std; ; int a[maxn]; int res[maxn] ...
- 【51NOD-0】1019 逆序数
[算法]离散化+树状数组(求逆序对) [题解]经典,原理是统计在i之前插入的且值≤i的个数,然后答案就是i-getsum(i) #include<cstdio> #include<a ...
- 51nod1019 逆序数
1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为 ...
- 51nod 1107 斜率小于零连线数量 特调逆序数
逆序数的神题.... 居然是逆序数 居然用逆序数过的 提示...按照X从小到大排列,之后统计Y的逆序数... 之后,得到的答案就是传说中的解(斜率小于零) #include<bits/stdc+ ...
- 51nod 1020 逆序排列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意: 思路: 一开始用了三重循环... 设f(n,k)表示n个数 ...
- HDU3465 树状数组逆序数
Life is a Line Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)T ...
随机推荐
- php调用mysql存储过程游标
<?php $dbtype = 'mysql'; $host = 'localhost'; $dbname = 'test'; $dsn = "$dbtype:host=$host;d ...
- 完美解决 No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
问题描述 好久之前的一个Android项目,最近需要重构一下 因为Android Studio的开发环境以及Gradle的版本等等都进行了一定的更新,于是导入Project以后,出现了报错: No t ...
- JavaScript深拷贝—我遇到的应用场景
简述 深拷贝即拷贝实例,其作用是为了不影响拷贝后的数组对起原数组造成影响.这时我们就需要进行深拷贝.(JavaScript的继承) 我遇到的应用场景 我是在用vue的element-ui做项目的时候遇 ...
- 服务器22端口连接超时 ssh: connect to host *** port 22: Operation timed out
最近酸酸乳出问题,连接v社服务器发现碰到 ssh: connect to host master port 22: Connection timed out 的问题.现在对该问题做一下可能出现的问题 ...
- HDU 4681 STRING dp+暴力。
题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ...
- nodejs pm2配置使用
nodejs pm2配置使用教程参考链接:http://www.111cn.net/sys/linux/100927.htm 安装步骤: yum -y install npmnpm install - ...
- MYSQL freedata 外联接
主要是解决,不同生产系统里面,有不同的数据库. SQL 又不能夸系统查询表. 只能在一个系统里,可以跨不同的数据库查表. 所以会用映射 .FREEDATA 这种方式,这样A 系统 里的表更新之后,就可 ...
- Java环境搭建---(基础)
首先下载eclipse开发工具,下载地址:http://www.eclipse.org/downloads/,界面如下: 选择eclipse juno(4.2)的版本进入界面 点击Downloads, ...
- 024——VUE中filter的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- WebApplication和WebSite的简单区别
初步认识网站和网站应用程序区别 1. 网页头部文件 网站 <%@ Page Language="VB" AutoEventWireup="false" C ...