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); }