HDU-5273

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 Lx,yR 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.

N1000,Q100000,LR,1a[i]2311
 

 

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;
}

 

 

posted on 2015-06-21 21:12  `Elaine  阅读(149)  评论(0编辑  收藏  举报

导航