codevs1688 求逆序对
题目描述 Description
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目
数据范围:N<=105。Ai<=105。时间限制为1s。
输入描述 Input Description
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
输出描述 Output Description
所有逆序对总数.
样例输入 Sample Input
4
3
2
3
2
样例输出 Sample Output
3
注意方案数很多,要用long long
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn = 100050; int n,num[maxn+50],c[maxn+50]; long long sum; int lowbit(int x){ return x&(-x); } void change(int p,int x){ for(int i = p;i <= maxn;i+=lowbit(i)) c[i] += x; } int query(int a,int b){ int sum = 0; for(int i = b;i;i-=lowbit(i)) sum += c[i]; for(int i = a-1;i;i-=lowbit(i)) sum -= c[i]; return sum; } int main(){ cin>>n; for(int i = 1;i <= n;i++){ scanf("%d",&num[i]); num[i]++; change(num[i],1); sum += i-query(1,num[i]); } cout<<sum; return 0; }