1. 程式人生 > >【bzoj1208】寵物收養所——treap

【bzoj1208】寵物收養所——treap

truct pri none 取余 rtu 相同 namespace splay 不同

第二道treap題,碼完之後總是RE……查了兩個多小時的錯,對拍了三四份代碼啊啊啊

剛開始發現if(tree[k].l*tree[k].r==0)k=tree[k].l+tree[k].r;這一句寫錯了,但改完還是WA或RE……

於是又找了接近兩個小時的錯啊啊啊,終於發現是左旋操作中的一個t打成了k,枉我之前還一直以為是del或者get_big寫錯了呢

還是不夠細心啊

好了,言歸正傳。

這道題由於題目說“同一時間呆在收養所中的,要麽全是寵物,要麽全是領養者”,那麽就可以建一棵treap樹(用一個變量ty儲存當前樹類型,即1或0),與當前樹類型相同就加入該節點,不同就對比該值與前驅值差和後繼值差的絕對值,取較小的一個(若相同則選前驅),接著ans加上該值(記得要取余mod!),然後del前驅或後繼,最後得到的ans即為答案。

具體細節看代碼。

技術分享
#include<cstdio>
#include<cstdlib>
#include<iostream>
const int mod=1000000;
using namespace std;
int n,root=0,ty,ans=0,size=0,tt,pp,a,b;
struct point
{
    int v,l,rnd,r;
}tree[100002];
void lturn(int &k)
{
    int t=tree[k].r;
    tree[k].r=tree[t].l;
    tree[t].l=k;
    k=t;
}
void rturn(int &k) { int t=tree[k].l; tree[k].l=tree[t].r; tree[t].r=k; k=t; } void insert(int &k,int x) { if(k==0) { size++;k=size; tree[k].l=tree[k].r=0; tree[k].v=x;tree[k].rnd=rand(); return; } if(x>tree[k].v) { insert(tree[k].r,x);
if(tree[tree[k].r].rnd<tree[k].rnd)lturn(k); } else { insert(tree[k].l,x); if(tree[tree[k].l].rnd<tree[k].rnd)rturn(k); } } void del(int &k,int x) { if(k==0)return; if(tree[k].v==x) { if(tree[k].l*tree[k].r==0)k=tree[k].l+tree[k].r; else if(tree[tree[k].l].rnd<tree[tree[k].r].rnd)rturn(k),del(k,x); else lturn(k),del(k,x); } else if(tree[k].v<x)del(tree[k].r,x); else del(tree[k].l,x); } void get_big(int k,int x) { if(k==0)return; if(tree[k].v<=x) { tt=k;get_big(tree[k].r,x); } else get_big(tree[k].l,x); } void get_small(int k,int x) { if(k==0){return;} if(tree[k].v>x) { pp=k;get_small(tree[k].l,x); } else get_small(tree[k].r,x); } int main() { int num=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d %d",&a,&b); if(!num){size=0;root=0,insert(root,b),ty=a,num++;} else if(a==ty){ insert(root,b); num++; } else { tt=0;get_big(root,b); pp=0;get_small(root,b); if(!pp||(tt&&tree[tt].v&&b-tree[tt].v<=tree[pp].v-b)){ans=(ans+b-tree[tt].v)%mod;del(root,tree[tt].v);} else {ans=(ans+tree[pp].v-b)%mod;del(root,tree[pp].v);} num--; } } printf("%d",ans); return 0; }
View Code

【bzoj1208】寵物收養所——treap