NYOJ 233 & amp; NYOJ 322 Sort (tree array)
Link: click here
Question:
Description 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.
Enter The input consists of T number of test cases. (<0 T <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. output For each case, output the minimum times need to sort it in ascending order on a single line. sample Input
231 2 344 3 2 1
Sample output
06
The idea is to calculate the number of reverse orders of a group of data. The tree array method is not explained:
Code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 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!