AmazingCounters.com

POJ2299 逆序数

传送门@百度。。

treap好久没写果然有点生疏了,注意答案是long long

 1 #include<set>
 2 #include<queue>
 3 #include<ctime>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<iostream>
 8 #include<algorithm>
 9 using namespace std;
10 const int N = 500010;
11 #define Ch1 (T[i].s[0])
12 #define Ch2 (T[i].s[1])
13 #define For(i,n) for(int i=1;i<=n;i++)
14 #define Rep(i,l,r) for(int i=l;i<=r;i++)
15 
16 void read(int &v){
17     char ch=getchar();
18     int num=0;
19     while(ch>'9'||ch<'0') ch=getchar();
20     while(ch>='0'&&ch<='9'){
21         num=num*10+ch-'0';
22         ch=getchar();
23     }
24     v=num;
25 }
26 
27 struct treap{
28     int v,size,pri;
29     int s[2];
30     void Sets(int x,int y){v=x;pri=y;size=1;}
31 }T[N];
32 
33 int n,x,cnt,root;
34 long long ans;
35 
36 void Update(int i){
37     T[i].size=T[Ch1].size+T[Ch2].size+1;
38 }
39 
40 void Rot(int &y,int f){
41     int x=T[y].s[!f];
42     T[y].s[!f]=T[x].s[f];
43     T[x].s[f]=y;
44     Update(y);Update(x);
45     y=x;
46 }
47 
48 void Insert(int &i,int x){
49     if(!i){
50         T[i=++cnt].Sets(x,rand());
51         T[i].s[0]=T[i].s[1]=0;
52         return;
53     }
54     int f=T[i].v>x;
55     Insert(T[i].s[!f],x);
56     if(T[T[i].s[!f]].pri>T[i].pri) Rot(i,f);
57     else                           Update(i);    
58 }
59 
60 int find(int i,int x){
61     if(T[i].v==x) return T[Ch1].size+1;
62     if(T[i].v<x) return T[Ch1].size+1+find(Ch2,x);
63     if(T[i].v>x) return find(Ch1,x);
64 }
65 
66 int main(){
67     while(read(n),n){
68         ans=0;
69         cnt=root=0;
70         For(i,n){
71             read(x);
72             Insert(root,x);     
73             ans+=i-(find(root,x));         
74         }
75         cout<<ans<<endl;
76     }
77     return 0;
78 }

 

posted @ 2014-11-04 14:50  ZJDx1998  阅读(162)  评论(0编辑  收藏  举报