• 「BZOJ1691」[Usaco2007 Dec] 挑剔的美食家 (Treap)


    Description

    与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了。现在,Farmer John不得不去牧草专供商那里购买大量美味多汁的牧草,来满足他那N(1 <= N <= 100,000)头挑剔的奶牛。 所有奶牛都对FJ提出了她对牧草的要求:第i头奶牛要求她的食物每份的价钱不低于A_i(1 <= A_i <= 1,000,000,000),并且鲜嫩程度不能低于B_i(1 <= B_i <= 1,000,000,000)。商店里供应M(1 <= M <= 100,000)种不同的牧草,第i 种牧草的定价为C_i(1 <= C_i <= 1,000,000,000),鲜嫩程度为D_i (1 <= D_i <= 1,000,000,000)。 为了显示她们的与众不同,每头奶牛都要求她的食物是独一无二的,也就是说,没有哪两头奶牛会选择同一种食物。 Farmer John想知道,为了让所有奶牛满意,他最少得在购买食物上花多少钱。

    Input

    * 第1行: 2个用空格隔开的整数:N 和 M

    * 第2..N+1行: 第i+1行包含2个用空格隔开的整数:A_i、B_i * 第N+2..N+M+1行: 第j+N+1行包含2个用空格隔开的整数:C_i、D_i

    Output

    * 第1行: 输出1个整数,表示使所有奶牛满意的最小花费。如果无论如何都无法 满足所有奶牛的需求,输出-1

    Sample Input

    4 7
    1 1
    2 3
    1 4
    4 2
    3 2
    2 1
    4 3
    5 2
    5 4
    2 6
    4 4

    Sample Output

    12 

    输出说明:

    给奶牛1吃价钱为2的2号牧草,奶牛2吃价钱为4的3号牧草,奶牛3分到价钱
    为2的6号牧草,奶牛4选择价钱为4的7号牧草,这种分配方案的总花费是12,为
    所有方案中花费最少的。

     
    思路:
    对牛和草的鲜嫩度从大到小排序,枚举牛,把大于等于第i头牛要求鲜嫩度的草的价格存到treap里,再找到最小的大于等于这头牛要求的价格的草也就是在树上找到k-1(牛要求的价格为k)的后继,加上这个价格,从平衡树中删掉这个点.
     
    实现代码;
    #include<bits/stdc++.h>
    using namespace std;
    #define ls t[x].ch[0]
    #define rs t[x].ch[1]
    #define ll long long
    const ll M = 2e5 + 10;
    const ll inf = 0x3f3f3f3f;
    map<int,int>mp;
    ll last[M],n,m,root,cnt;
    struct node{
        ll ch[2],cnt,siz,val,rd;
    }t[M];
    
    struct node1{
        ll x,y;
    }a[M],b[M];
    
    bool cmp(node1 p,node1 q){
        return p.y > q.y;
    }
    
    void up(ll x){
        t[x].siz = t[ls].siz + t[rs].siz+t[x].cnt;
    }
    
    void rotate(ll &x,ll d){
        ll son = t[x].ch[d];
        t[x].ch[d] = t[son].ch[d^1];
        t[son].ch[d^1] = x; up(x); up(x=son);
    }
    
    void Insert(ll &x,ll val){
        if(!x){
            x = ++cnt;
            t[x].cnt = t[x].siz = 1;
            t[x].val = val,t[x].rd = rand();
            return ;
        }
        t[x].siz ++;
        if(t[x].val == val){
            t[x].cnt++; return ;
        }
        ll d = t[x].val < val; Insert(t[x].ch[d],val);
        if(t[x].rd > t[t[x].ch[d]].rd) rotate(x,d);
    }
    
    void del(ll &x,ll val){
        if(!x) return ;
        if(t[x].val == val){
            if(t[x].cnt > 1){
                t[x].cnt--,t[x].siz--;return ;
            }
            bool d = t[ls].rd > t[rs].rd;
            if(ls == 0||rs == 0) x = ls+rs;
            else rotate(x,d),del(x,val);
        }
        else t[x].siz--,del(t[x].ch[t[x].val<val],val);
    }
    
    ll rk(ll x,ll val){
        if(!x) return 0;
        if(t[x].val == val) return t[ls].siz+1;
        if(t[x].val > val) return rk(ls,val);
        return rk(rs,val)+t[ls].siz+t[x].cnt;
    }
    
    ll kth(ll root,ll k){
        ll x = root;
        while(1){
            if(k <= t[ls].siz) x = ls;
            else if(k > t[ls].siz+t[x].cnt)
                k -= t[ls].siz+t[x].cnt,x = rs;
            else return t[x].val;
        }
    }
    
    ll pre(ll x,ll val){
        if(!x) return -inf;
        if(t[x].val >= val) return pre(ls,val);
        return max(pre(rs,val),t[x].val);
    }
    
    ll nex(ll x,ll val){
        if(!x) return inf;
        if(t[x].val <= val) return nex(rs,val);
        return min(nex(ls,val),t[x].val);
    }
    
    int main()
    {
        ll n,m,ans=0;
        cin>>n>>m;
        for(ll i = 1;i <= n;i ++) cin>>a[i].x>>a[i].y;
        for(ll i = 1;i <= m;i ++) cin>>b[i].x>>b[i].y;
        sort(a+1,a+1+n,cmp); sort(b+1,b+1+m,cmp);
        ll j =  1; root = 0;
        for(ll i = 1;i <= n;i ++){
            while(b[j].y>=a[i].y&&j<=m) {
                Insert(root,b[j].x);j++;
            }
            ll num = nex(root,a[i].x-1);
            if(num == -inf){
                cout<<-1<<endl;return 0;
            }
            ans += num; del(root,num);
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    在nginx环境下搭建基于ssl证书的websocket服务转发,wss
    在nginx环境下搭建https服务,代理到本地web项目
    java CountDownLatch报错java.lang.IllegalMonitorStateException: null
    https本地自签名证书添加到信任证书访问
    10013: An attempt was made to access a socket in a way forbidden by its access permissions
    chrome 报错 ERR_CERT_AUTHORITY_INVALID
    SDKMAN一个基于命令行界面的SDK用户环境管理程序
    springboot放到linux启动报错:The temporary upload location [/tmp/tomcat.8524616412347407692.8111/work/Tomcat/localhost/ROOT/asset] is not valid
    netty-websocket-spring-boot-starter关闭报错 io/netty/channel/AbstractChannel$AbstractUnsafe io/netty/util/concurrent/GlobalEventExecutor
    HTML DOM addEventListener() 方法
  • 原文地址:https://www.cnblogs.com/kls123/p/10691791.html
Copyright © 2020-2023  润新知