首页 > 代码库 > POJ2299 逆序数
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 }
POJ2299 逆序数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。