自己做网站表白,wordpress 国产,中国太空网站,Wordpress页面手机不适配文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述
猫猫 TOM 和小老鼠 JERRY 最近又较量上了#xff0c;但是毕竟都是成年人#xff0c;他们已经不喜欢再玩那种你追我赶的游戏#xff0c;现在他们喜欢玩统计。
最近#xff0c;TOM… 文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述
猫猫 TOM 和小老鼠 JERRY 最近又较量上了但是毕竟都是成年人他们已经不喜欢再玩那种你追我赶的游戏现在他们喜欢玩统计。
最近TOM 老猫查阅到一个人类称之为“逆序对”的东西这东西是这样定义的对于给定的一段正整数序列逆序对就是序列中 a i a j a_ia_j aiaj 且 i j ij ij 的有序对。知道这概念后他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。
Update: 数据已加强。
输入格式
第一行一个数 n n n表示序列中有 n n n个数。
第二行 n n n 个数表示给定的序列。序列中每个数字不超过 1 0 9 10^9 109。
输出格式
输出序列中逆序对的数目。
样例
样例输入
6
5 4 2 6 3 1样例输出
11数据范围与提示
对于 25 % 25\% 25% 的数据 n ≤ 2500 n \leq 2500 n≤2500。
对于 50 % 50\% 50% 的数据 n ≤ 4 × 1 0 4 n \leq 4 \times 10^4 n≤4×104。
对于所有数据 n ≤ 5 × 1 0 5 n \leq 5 \times 10^5 n≤5×105
请使用较快的输入输出。
应该不会 O ( n 2 ) O(n^2) O(n2) 过 50 万吧。—— chen_zhe
完整代码
#include iostream
using namespace std;
inline int read() {register int x 1, ans 0;register char ch getchar();while (ch 0 || ch 9) {if (ch -)x -1;ch getchar();}while (ch 0 ch 9) {ans (ans 3) (ans 1) ch - 48;ch getchar();}return x * ans;
}
long long ans 0;
int n, a[500001], b[500001];
void mergesort(int l, int r) {if (l r)return;int mid l r 1, N l - 1, lt l, rt mid 1;mergesort(l, mid), mergesort(mid 1, r);while (lt mid rt r) {if (a[lt] a[rt])b[N] a[lt];elseb[N] a[rt], ans mid - lt 1;}while (lt mid) b[N] a[lt];while (rt r) b[N] a[rt];for (int i l; i r; i) a[i] b[i];
}
int main() {n read();for (int i 1; i n; i) a[i] read();mergesort(1, n);printf(%lld, ans);return 0;
}