• 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 }
  • 相关阅读:
    [ECNU 1624] 求交集多边形面积
    [转] Java之ACM速成
    [swustoj 191] 迷宫逃离
    [Swustoj 24] Max Area
    PICK定理模板
    [HDU 1007] Quoit Design
    [转] 最近点对距离问题
    [POJ 2184] Cow Exhibition
    SGU 144.Meeting
    SGU 143.Long Live the Queen(女王万岁)
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/4073695.html
Copyright © 2020-2023  润新知