BZOJ 1208 set

思路:

开俩set

模拟一下

就好了

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
int n,xx,yy;
set<int>s1,s2;set<int>::iterator it;
long long ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&xx,&yy);
        if(!xx){
            if(s2.empty())s1.insert(yy);
            else{
                int tmp=2147483647;
                it=s2.lower_bound(yy);
                if(it!=s2.begin())it--,tmp=min(tmp,yy-*it),it++;
                if(it!=s2.end())tmp=min(tmp,*it-yy);
                if(it!=s2.begin()){
                    it--;
                    if(yy-*it==tmp){s2.erase(it);goto ed1;}
                    it++;
                }s2.erase(it);
                ed1:ans+=tmp;
            }
        }
        else{
            if(s1.empty())s2.insert(yy);
            else{
                int tmp=2147483647;
                it=s1.lower_bound(yy);
                if(it!=s1.begin())it--,tmp=min(tmp,yy-*it),it++;
                if(it!=s1.end())tmp=min(tmp,*it-yy);
                if(it!=s1.begin()){
                    it--;
                    if(yy-*it==tmp){s1.erase(it);goto ed2;}
                    it++;
                }s1.erase(it);
                ed2:ans+=tmp;
            }
        }
    }printf("%lld\n",ans%1000000);
}

 

posted @ 2018-07-26 14:27  SiriusRen  阅读(217)  评论(0编辑  收藏  举报