zoukankan      html  css  js  c++  java
  • BZOJ 1691 usaco2007 挑剔的美食家

    1691: [Usaco2007 Dec]挑剔的美食家

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 915  Solved: 469
    [Submit][Status][Discuss]

    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,为
    所有方案中花费最少的。

    HINT

    Source

    Gold

    贪心+treep

    排序后扔到treep里

    #include  <bits/stdc++.h>
    using namespace std;
    inline int read(){
     int x=0;int f=1;char ch=getchar();
     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
     return x*f;
    }
    const int MAXN=3e5+10;
    namespace zhangenming{
     int n,m,tol=0,root=0,tmp;
     struct node{
      int x,y;
     }a[MAXN],b[MAXN];
     struct tree{
      int leftt,rightt,v,siz,weight,have;
     }T[MAXN];
     bool mycmp(node n,node m){
       return n.y>m.y;
     }
     void init(){
      
      n=read();m=read();
      for(int i=1;i<=n;i++){
       a[i].x=read();a[i].y=read();
      }
      for(int i=1;i<=m;i++){
       b[i].x=read();b[i].y=read();
      }
      sort(a+1,a+n+1,mycmp);
      sort(b+1,b+m+1,mycmp);
     }
     void update(int &root) {T[root].siz=T[T[root].leftt].siz+T[T[root].rightt].siz+T[root].weight;}
     void left_rote(int &root){
      int tmp=T[root].rightt;T[root].rightt=T[tmp].leftt;T[tmp].leftt=root;
      T[tmp].siz=T[root].siz;update(root);root=tmp;
     }
     void right_rote(int &root){
      int tmp=T[root].leftt;T[root].leftt=T[tmp].rightt;T[tmp].rightt=root;
      T[tmp].siz=T[root].siz;update(root);root=tmp;
     }
     void insert(int &root,int x){
      if(root==0) {tol++;root=tol;T[root].siz=T[root].weight=1;T[root].v=x;T[root].have=rand();return;}
      T[root].siz++;
      if(T[root].v==x) {T[root].weight++;return;} 
       if(x>T[root].v){
        insert(T[root].rightt,x);
        if(T[root].have<T[T[root].rightt].have) left_rote(root);
       }
       else{
        insert(T[root].leftt,x);
        if(T[T[root].leftt].have>T[root].have) right_rote(root);
       }
     }
     void delte(int &root,int x){
     if(root==0) return;
      if(x==T[root].v){
       if(T[root].weight>1) {T[root].weight--;T[root].siz--;return;}
       else{
        if(T[root].leftt*T[root].rightt==0) root=T[root].leftt+T[root].rightt;
        else{
         if(T[T[root].leftt].have<T[T[root].rightt].have) {right_rote(root);delte(root,x);}
         else {left_rote(root);delte(root,x);}
        } 
       }
      }
      T[root].siz--;
      if(x<T[root].v) delte(T[root].leftt,x);
      else delte(T[root].rightt,x);
     }
     void nxt(int root,int x){
      if(root==0) return;
      if(T[root].v>=x) {tmp=T[root].v;nxt(T[root].leftt,x);}
      else nxt(T[root].rightt,x);
     }
     void solve(){
       int j=1;
       long long int ans=0;
       for(int i=1;i<=n;i++){
         while(b[j].y>=a[i].y&&j<=m)  insert(root,b[j++].x);
         tmp=-1;
         nxt(root,a[i].x);
         if(tmp==-1) {cout<<-1<<endl;exit(0);}
         ans+=tmp;
         delte(root,tmp);
       }
       cout<<ans<<endl;
     }
    }
    int main(){
     using namespace zhangenming;
     init();
     solve();
     return 0;
    }
    

      

  • 相关阅读:
    redis 之redis集群与集群配置
    redis 之redis-sentinel主从复制高可用
    Python 基础之函数的嵌套与nonlocal修改局部变量及闭包函数
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7906287.html
Copyright © 2011-2022 走看看