題解 [HNOI2004]寵物收養場
阿新 • • 發佈:2019-05-08
build val mes 同一時間 重復 == %d 解析 fin
解析
這題似乎是裸的平衡樹\(+\)模擬...於是用\(treap\)寫了個板子.
看上去,我們似乎要維護兩顆樹(寵物和顧客),
然而,註意到,同一時間寵物點只有一類人(或物qwq),
所以,只要判斷當前寵物店和詢問是否是一樣,
根據題意模擬就行了.
另外,沒有重復感覺比較舒服
上AC代碼吧:
#include <iostream> #include <cstdio> #include <cstring> #include <stdlib.h> #define INF 0x7fffffff #define Mod 1000000 using namespace std; inline int read(){ int sum=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){sum=sum*10+c-'0';c=getchar();} return sum*f; } struct tree{int l,r,val,dat;}t[1000001]; int n,root,tot=0,ans=0; int ok,sum=0; inline int New(int val){ t[++tot].val=val;t[tot].dat=rand(); return tot; } inline void build(){ New(-INF);New(INF); root=1;t[1].r=2; } inline void zig(int &p){ int q=t[p].l; t[p].l=t[q].r;t[q].r=p;p=q; } inline void zag(int &p){ int q=t[p].r; t[p].r=t[q].l;t[q].l=p;p=q; } void insert(int &p,int val){ if(!p){p=New(val);return ;} insert(val<t[p].val? t[p].l:t[p].r,val); if(t[t[p].l].dat>t[p].dat) zig(p); if(t[t[p].r].dat>t[p].dat) zag(p); } void remove(int &p,int val){ if(!p) return ; if(t[p].val==val){ if(!t[p].l&&!t[p].r){p=0;return ;} if(!t[p].r||t[t[p].l].dat>t[t[p].r].dat){ zig(p);remove(t[p].r,val); } else{ zag(p);remove(t[p].l,val); } } remove(val<t[p].val? t[p].l:t[p].r,val); } inline int getpre(int val){ int ans=1,p=root; while(p){ if(t[p].val==val) return val; if(t[p].val<val&&t[p].val>t[ans].val) ans=p; p=val<t[p].val? t[p].l:t[p].r; } return t[ans].val; } inline int getnext(int val){ int ans=2,p=root; while(p){ if(t[p].val==val) return val; if(t[p].val>val&&t[p].val<t[ans].val) ans=p; p=val<t[p].val? t[p].l:t[p].r; } return t[ans].val; } inline void find(int val){ int l=getpre(val),r=getnext(val); if(l!=-INF&&val-l<=r-val){ans=(ans+val-l)%Mod;remove(root,l);sum--;} else{ans=(ans+r-val)%Mod;remove(root,r);sum--;} } int main(){ n=read();build(); for(int i=1;i<=n;i++){ int x=read(),y=read(); if(!sum){insert(root,y);sum++;ok=x;}//店裏什麽都沒有 else if(x==ok){insert(root,y);sum++;}//詢問和店裏的一樣 else find(y);//不一樣,可以帶走 } printf("%d\n",ans); return 0; }
題解 [HNOI2004]寵物收養場