0
点赞
收藏
分享

微信扫一扫

NYOJ 233 &&NYOJ 322 Sort(树状数组)


链接:​​click here​​

题意:


描述 You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.

For example, 1 2 3 5 4, we only need one operation : swap 5 and 4.

输入 The input consists of T number of test cases.(<0T<1000) Each case consists of two lines: the first line contains a positive integer n (n <= 1000); the next line contains a permutation of the n integers from 1 to n. 输出 For each case, output the minimum times need to sort it in ascending order on a single line. 样例输入

2
3
1 2 3
4
4 3 2 1

样例输出

0
6

思路:就是求一组数据的逆序数,树状数组求法,不解释:

代码:

#include <math.h>
#include <queue>
#include <deque>
#include <vector>
#include <stack>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
const double eps = 1e-6;
const double Pi = acos(-1.0);
static const int inf= ~0U>>2;
static const int maxn =110;
int h[1000001],w[100],Map[200];
int m[10001], N;
void Add(int i)
{
while(i<=1001)
{
m[i]++;
i+=lowbit(i);
}
}
int Sum(int i)
{
int res=0;
while(i>0)
{
res+=m[i];
i-=lowbit(i);
}
return res;
}
int main()
{
int T,temp;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
memset(m,0,sizeof(m));
int ans=0;
for(int i=1; i<=N; i++)
{
scanf("%d",&temp);
Add(temp);
ans+=(i-Sum(temp));
}
printf("%d\n",ans);
}
return 0;
}

When you want to give up, think of why you persist until now



举报

相关推荐

0 条评论