对task和machine的yi由小到大进行排序,然后对machine来跟task配对。当machine[].yi >= task[].yi时,就更新线段树,在1-1440上做线段树,线段树存的是task[].xi,同时用用优先队列保存task[].yi;当machine[].yi < task[].yi时,就查找 1到machine[].xi最大的值。如果存在最大值的话,把优先队列里的task[].yi取出来。。这样一个machine就匹配到了一个最优的任务。还是看代码好好意会吧,细节挺多的

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<string>
 6 #include<queue>
 7 #include<cmath>
 8 #include<map>
 9
10 using namespace std;
11
12 #define mnx 100050
13 #define ll long long
14 #define inf 0x3f3f3f3f
15 #define lson l, m, rt << 1
16 #define rson m+1, r, rt << 1 | 1
17
18 priority_queue<int> q[1500];
19 int cnt[1500], sum[8000];
20 struct s{
21     int xi, yi;
22     bool operator < ( const s & b ) const{
23         return yi < b.yi;
24     }
25 }a[mnx], b[mnx];
26 void pushup( int rt ){
27     sum[rt] = max( sum[rt<<1], sum[rt<<1|1] );
28 }
29 void build( int l, int r, int rt ){
30     if( l == r ){
31         sum[rt] = -1;
32         return ;
33     }
34     int m = ( l + r ) >> 1;
35     build( lson ), build( rson );
36     pushup( rt );
37 }
38 int find( int L, int R, int l, int r, int rt ){
39     if( L <= l && R >= r ){
40         return sum[rt];
41     }
42     int m = ( l + r ) >> 1;
43     int ret = -1;
44     if( L <= m ) ret = max( ret, find( L, R, lson ) );
45     if( R > m ) ret = max( ret, find( L, R, rson ) );
46     return ret;
47
48 }
49 void update( int u, int v, int l, int r, int rt ){
50     if( l == r ){
51         sum[rt] = v;
52         return ;
53     }
54     int m = ( l + r ) >> 1;
55     if( u <= m ) update( u, v, lson );
56     else update( u, v, rson );
57     pushup( rt );
58 }
59 int main(){
60     int n, m;
61     const int nn = 1450;
62     while( scanf( "%d%d", &n, &m ) != EOF ){
63         for( int i = 0; i < nn; i++ ){
64             while( !q[i].empty() ) q[i].pop();
65         }
66         memset( cnt, 0, sizeof(cnt) );
67         for( int i = 0; i < n; i++ ){
68             scanf( "%d%d", &a[i].xi, &a[i].yi );
69         }
70         for( int i = 0; i < m; i++ ){
71             scanf( "%d%d", &b[i].xi, &b[i].yi );
72         }
73         sort( a, a+n );
74         sort( b, b+m );
75         build( 1, nn, 1 );
76         int j = 0, ans1 = 0; ll ans2 = 0;
77         for( int i = 0; i < n; i++ ){
78             while( j < m && a[i].yi >= b[j].yi ){
79                 if( !cnt[b[j].xi] ){
80                     update( b[j].xi, b[j].xi, 1, nn, 1 );
81                 }
82                 cnt[b[j].xi]++;
83                 q[b[j].xi].push( b[j].yi );
84                 j++;
85             }
86             int t = find( 1, a[i].xi, 1, nn, 1 );
87             if( t == - 1 ) continue;
88             cnt[t]--;
89             if( cnt[t] == 0 ) update( t, -1, 1, nn, 1 );
90             int tt = q[t].top();  q[t].pop();
91             ans1++;
92             ans2 += t * 500 + tt * 2;
93         }
94         printf( "%d %I64d\n", ans1, ans2 );
95     }
96     return 0;
97 }

转载于:https://www.cnblogs.com/LJ-blog/p/3863077.html

hdu 4864(2) 线段树相关推荐

  1. HDU 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

  2. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  3. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

  4. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  5. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  6. YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)

    YJJ's Salesman 题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -> (1e9, 1e9):只能向下,向右, 向右下移动:地图中有n个点,有宝藏 ...

  7. HDU 4288 Coder [线段树]

    维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和. CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过. 用线段树和平衡树都可以做这题,线段树需要先离散化,然 ...

  8. hdu 1540(线段树单点更新 区间合并)

    解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改 lsum:从这个区间的左端点往右能够找到的最大连续区间: rsum:从这个区间的右端点 ...

  9. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

最新文章

  1. 【译】Spring 官方教程:使用 Restdocs 创建 API 文档
  2. MyBatis 通用Mapper 入门教程
  3. Linux操作系统Ubuntu部署J2EE篇
  4. mysql互为主从利弊_MySQL互为主从复制常见问题
  5. vb中多个串口通讯_VB中的42个关键字,你知道都是哪些吗?
  6. linux ruby gem 安装目录,linux 安装 gem
  7. Angular里的购物车页面实现
  8. 关于开发中的常用手段(个人建议)
  9. mpvue配置底部菜单栏图标路径报错
  10. c#检查SQL语法是否正确,不执行SQL语句
  11. 生产者与消费者 代码实现 java
  12. 网络安全:系统进程的基本概述
  13. 2014传智播客ios第4期基础班+就业班
  14. 基于java物流管理信息系统
  15. 满满干货!邮储银行java面试
  16. 不要让刷单限制了你的运营能力,零基础店铺流量爆发技巧!
  17. win10卸载ie11后安装不上
  18. STM32 Combined PWM的用法
  19. 什么是winpe,winpe系统有什么作用?
  20. Java中缓存之内存缓存

热门文章

  1. java调用存储过程分页
  2. 【mybatis-plus】什么是乐观锁?如何实现“乐观锁”
  3. 远程桌面提示:身份验证错误 要求的函数不受支持
  4. Warning: POST Content-Length of 29328854 bytes exceeds the limit of 8388608 bytes in Unknown on line
  5. 开源HTTP解析器---http-parser和fast-http
  6. java排序算法之冒泡排序
  7. sklearn机器学习常用过程总结
  8. Elasticsearch文档的CRUD
  9. hbase命令行演示
  10. 机器学习——前馈神经网络