码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ 1208】[HNOI2004]宠物收养所

时间:2018-04-09 11:19:55      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:++   class   return   cpp   const   等于   col   geo   problem   

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


用set搞。
(因为规定了不会有相同特点值的东西。
所以可以不用multiset.
那么每次用lower_bound找离它最近的配对就好了

【代码】

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD = 1000000;

int n;
set<ll> myset[2];
ll ans = 0;

int main()
{
    scanf("%d",&n);
    for (int i = 1;i <= n;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        myset[a].insert(b);
        for (int j = 0;j<=1;j++)
            if ((int)myset[j].size()==1 && (int)myset[1-j].size()>0){
                ll x = (*myset[j].begin());
                myset[j].erase(myset[j].begin());
                set<ll>::iterator temp = myset[1-j].lower_bound(x);
                if (temp==myset[1-j].begin()){
                    //全都大于等于x
                    ans = (ans+(*temp)-x)%MOD;
                    myset[1-j].erase(temp);
                    break;
                }else if (temp==myset[1-j].end()){
                    //全都比x来的小
                    temp--;
                    ans= (ans + x-(*temp))%MOD;
                    myset[1-j].erase(temp);
                }else{
                    ll temp1 = abs(x-(*temp));
                    temp--;
                    ll temp2 = abs(x-(*temp));
                    if (temp2<=temp1){
                        ans=(ans + temp2)%MOD;
                        myset[1-j].erase(temp);
                    }else{
                        ans=(ans + temp1)%MOD;
                        temp++;
                        myset[1-j].erase(temp);
                    }
                }


            }
    }
    printf("%lld\n",ans);
    return 0;
}

【BZOJ 1208】[HNOI2004]宠物收养所

标签:++   class   return   cpp   const   等于   col   geo   problem   

原文地址:https://www.cnblogs.com/AWCXV/p/8757311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!