zoukankan      html  css  js  c++  java
  • 1691: [Usaco2007 Dec]挑剔的美食家

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

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 926  Solved: 477
    [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,为
    所有方案中花费最少的。
     
     

    code

    贪心,之后查找前驱,

    treap,splay,set等都支持

      1 #include<cstdio>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<iostream>
      6 
      7 using namespace std;
      8 
      9 #define lson t[k].l
     10 #define rson t[k].r
     11 typedef long long LL;
     12 const int N = 200100;
     13 
     14 struct Data{
     15     int l,r,key,val,cnt;
     16 }t[N];
     17 struct Node{
     18     int x,y;
     19     bool operator < (const Node &c) const {
     20         if (x==c.x) return y < c.y;
     21         return x < c.x;
     22     }
     23 }a[N],b[N];
     24 int tn,Root,ans;
     25 LL Ans;
     26 
     27 inline char nc() {
     28     static char buf[100000],*p1 = buf,*p2 = buf;
     29     return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
     30 }
     31 inline int read() {
     32     int x = 0,f = 1;char ch = nc();
     33     for (; ch<'0'||ch>'9'; ch = nc()) if (ch=='-') f = -1;
     34     for (; ch>='0'&&ch<='9'; ch = nc()) x = x * 10 + ch - '0';
     35     return x * f;
     36 }
     37 inline void lturn(int &k) {
     38     int a = rson;
     39     rson = t[a].l;
     40     t[a].l = k;
     41     k = a;
     42 }
     43 inline void rturn(int &k) {
     44     int a = lson;
     45     lson = t[a].r;
     46     t[a].r = k;
     47     k = a;
     48 }
     49 void Insert(int &k,int x) {
     50     if (k==0) {
     51         ++tn;k = tn;
     52         t[k].cnt = 1;
     53         t[k].val = x;t[k].key = rand();
     54         return ;
     55     }
     56     if (x == t[k].val) t[k].cnt++;
     57     else if (x > t[k].val) {
     58         Insert(rson,x);
     59         if (t[rson].key < t[k].key) lturn(k);
     60     }
     61     else {
     62         Insert(lson,x);
     63         if (t[lson].key < t[k].key) rturn(k);
     64     }
     65 }
     66 void Delete(int &k,int x) {
     67     if (k==0) return ;
     68     if (t[k].val == x) {
     69         if (t[k].cnt > 1) {t[k].cnt --;return ;}
     70         if (t[lson].val * t[rson].val == 0) k = lson + rson;
     71         else if (t[lson].key < t[rson].key) rturn(k),Delete(k,x);
     72         else lturn(k),Delete(k,x);
     73     }
     74     else if (x > t[k].val) Delete(rson,x);
     75     else Delete(lson,x);
     76 }
     77 void getpre(int &k,int x) {
     78     if (k==0) return ;
     79     if (x >= t[k].val) ans = k,getpre(rson,x);
     80     else getpre(lson,x);
     81 }
     82 int main() {
     83     int n = read(),m = read();
     84     for (int i=1; i<=n; ++i) 
     85         a[i].x = read(),a[i].y = read();
     86     for (int i=1; i<=m; ++i) 
     87         b[i].x = read(),b[i].y = read();
     88 
     89     sort(a+1,a+n+1);
     90     sort(b+1,b+m+1);
     91     
     92     int i = 1,j = 1,c = 0;
     93     for (; i<=m; ++i) {
     94         while (a[j].x <= b[i].x && j <= n) Insert(Root,a[j].y),j++;
     95         ans = -1;getpre(Root,b[i].y);
     96         if (ans==-1) {c++;continue;}
     97         Delete(Root,t[ans].val);
     98         Ans += b[i].x;
     99     }
    100     if (j <= n || (m-c)<n) cout<<"-1";
    101     else cout<<Ans;
    102     return 0;
    103 }
  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8016511.html
Copyright © 2011-2022 走看看