zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/4073695.html
Copyright © 2011-2022 走看看