zoukankan      html  css  js  c++  java
  • BZOJ1208 宠物收养所

    裸treap,求前驱后继,这里使用了一个二维结构体。

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 struct node
      4 {
      5     int l,r,size,rnd,v,w;
      6 }t[2][100005];
      7 int rt1,rt2,cnt[2];
      8 void merge(int x,int k)
      9 {
     10     t[x][k].size=t[x][t[x][k].l].size+t[x][t[x][k].r].size+t[x][k].w;
     11 }
     12 void lturn(int x,int &k)
     13 {
     14     int rs=t[x][k].r;
     15     t[x][k].r=t[x][rs].l;
     16     t[x][rs].l=k;
     17     t[x][rs].size=t[x][k].size;
     18     merge(x,k);
     19     k=rs;
     20 }
     21 void rturn(int x,int &k)
     22 {
     23     int ls=t[x][k].l;
     24     t[x][k].l=t[x][ls].r;
     25     t[x][ls].r=k;
     26     t[x][ls].size=t[x][k].size;
     27     merge(x,k);
     28     k=ls;
     29 }
     30 void add(int x,int &k,int w)
     31 {
     32     if(!k)
     33     {
     34         k=++cnt[x];
     35         t[x][k].size=t[x][k].w=1;
     36         t[x][k].v=w;
     37         t[x][k].rnd=rand();
     38         return;
     39     }
     40     t[x][k].size++;
     41     if(t[x][k].v==w)t[x][k].w++;
     42     else if(t[x][k].v<w)
     43     {
     44         add(x,t[x][k].r,w);
     45         if(t[x][t[x][k].r].rnd>t[x][k].rnd)
     46         lturn(x,k);
     47     }
     48     else 
     49     {
     50         add(x,t[x][k].l,w);
     51         if(t[x][t[x][k].l].rnd>t[x][k].rnd)
     52         rturn(x,k);
     53     }
     54 }
     55 void del(int x,int &k,int w)
     56 {
     57     if(!k)return;
     58     if(t[x][k].v==w)
     59     {
     60         if(t[x][k].w>1)
     61         {
     62             t[x][k].w--;t[x][k].size--;
     63         }
     64         else if(t[x][k].l*t[x][k].r==0)k=t[x][k].l+t[x][k].r;
     65         else
     66         {
     67             if(t[x][t[x][k].l].rnd<t[x][t[x][k].r].rnd)
     68             {
     69                 rturn(x,k);
     70                 del(x,k,w);
     71             }
     72             else
     73             {
     74                 lturn(x,k);
     75                 del(x,k,w);
     76             }
     77         }
     78     }
     79     else
     80     {
     81         t[x][k].size--;
     82         if(w>t[x][k].v)del(x,t[x][k].r,w);
     83         else del(x,t[x][k].l,w);
     84     }
     85 }
     86 int a,b;
     87 int pre(int x,int k,int w)
     88 {
     89     if(!k)return -1e9;
     90     if(t[x][k].v<=w)
     91     {
     92         return max(t[x][k].v,pre(x,t[x][k].r,w));
     93     }
     94     else return pre(x,t[x][k].l,w);
     95 }
     96 int las(int x,int k,int w)
     97 {
     98     if(!k)return 1e9;
     99     if(t[x][k].v>=w)
    100     {
    101         return min(t[x][k].v,las(x,t[x][k].l,w));
    102     }
    103     else return las(x,t[x][k].r,w);
    104 }
    105 int main()
    106 {
    107     int n;int x,f;
    108     scanf("%d",&n);
    109     int ans=0;
    110     for(int i=1;i<=n;++i)
    111     {
    112         scanf("%d%d",&f,&x);
    113         if(!f)
    114         {
    115             if(t[1][rt1].size&&rt1)
    116             {
    117                 int a=pre(1,rt1,x);
    118                 int b=las(1,rt1,x);
    119                 if(abs(x-a)<=abs(x-b))
    120                 {
    121                     del(1,rt1,a);
    122                     ans+=abs(x-a);ans%=1000000;
    123                 }
    124                 else
    125                 {
    126                     del(1,rt1,b);
    127                     ans+=abs(x-b);ans%=1000000;
    128                 }
    129             }
    130             else
    131             {
    132                 add(0,rt2,x);
    133             }
    134         }
    135         else
    136         {
    137             if(t[0][rt2].size&&rt2)
    138             {
    139                 int a=pre(0,rt2,x);
    140                 int b=las(0,rt2,x);
    141                 if(abs(x-a)<=abs(x-b))
    142                 {
    143                     del(0,rt2,a);
    144                     ans+=abs(x-a);ans%=1000000;
    145                 }
    146                 else
    147                 {
    148                     del(0,rt2,b);
    149                     ans+=abs(x-b);ans%=1000000;
    150                 }
    151             }
    152             else
    153             {
    154                 add(1,rt1,x);
    155             }
    156         }
    157     }
    158     printf("%d
    ",ans);
    159     return 0;
    160 }
    生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。
  • 相关阅读:
    css3中-webkit-text-size-adjust详解
    CSS 让标点符号不出现在行首
    html.day02
    老生常谈的问题——抽象类与接口
    C# 4个小技巧
    IIS状态代码的含义
    关于线程的synchronized、wait(),notify
    再说粗粒度
    粗粒度与细粒度
    .NET中栈和堆的比较 #1
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/7955690.html
Copyright © 2011-2022 走看看