Dylans loves sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 372 Accepted Submission(s): 186
Problem Description
Dylans is given N numbers a[1]....a[N]
And there are Q questions.
Each question is like this (L,R)
his goal is to find the “inversions” from number L to number R.
more formally,his needs to find the numbers of pair(x,y),
that L≤x,y≤R and x<y and a[x]>a[y]
Input
In the first line there is two numbers N and Q.
Then in the second line there are N numbers:a[1]..a[N]
In the next Q lines,there are two numbers L,R in each line.
N≤1000,Q≤100000,L≤R,1≤a[i]≤231−1
Output
For each query,print the numbers of "inversions”
Sample Input
3 2
3 2 1
1 2
1 3
Sample Output
1
3
Hint
You shouldn‘t print any space in each end of the line in the hack data.
Source
/** 题意:给出一个数列,求某个区间的逆序数对有多少个 做法:因为N 最大1000 所以 枚举,还以为是笼统的归并排序 **/ #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <cmath> #define maxn 1010 using namespace std; int dp[maxn][maxn]; int mmap[maxn]; int main() { //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); //#endif // ONLINE_JUDGE int n,m; while(~scanf("%d %d",&n,&m)) { for(int i=1;i<=n;i++) { scanf("%d",&mmap[i]); } memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(mmap[i] > mmap[j]) dp[i][j] ++; } for(int j=1;j<=n;j++) { dp[i][j] += dp[i][j-1]; } } for(int i=n-1;i>0;i--) ///枚举i~j中任意一个区间的逆序数对 { for(int j=i+1;j<=n;j++) { dp[i][j] += dp[i+1][j]; } } while(m--) { int u,v; scanf("%d %d",&u,&v); printf("%d\n",dp[u][v]); } } return 0; }