9.26T6 CQBZ

【NOIP2016-4】 火车运输

Description

ByteLand火车站(编号0)每天都要发往全国各地N列客运火车,编号1 N。第i列火车的目的地是编号Si的火车站。
对任意车站X,都与X+1车站有铁轨直接相连,因此火车站可以看成数轴上的整数点,第i列火车可以停靠区间[0, Si]中的各个站点。每列火车装载乘客的最大容量为Ci。
有M个人需要乘坐火车。已知每个人的乘车区间为[Li, Ri],即是说,在Li上车,在Ri下车。由于火车的容量限制,请你求出最多有多少人的乘车需求可以得到满足。

Input

第1行:2个整数N和M。
接下来N行,每行2个整数Si和Ci,表示第i辆车的目的站和容量。
接下来M行,每行2个整数Li和Ri,表示第i个乘客的乘车区间。

Output

1行:1个整数,表示最多有多少乘客的乘车需求可以满足

Sample Input

1 3 10 2 1 5 3 7 4 9

Sample Output

2

Hint

数据范围和约定
∙对于20%的数据,n= 1, 1 ≤m ≤ 10^5,1≤si,ci ≤ 10^9,1≤li ≤ri ≤10^9。
对于另外20%的数据,
1≤n,m ≤ 2000,1≤si,ci ≤10^9,1≤li ≤ri ≤10^9
对于另外100%的数据,
1≤n,m ≤ 10^5,1≤si,ci ≤10^9,1≤li ≤ri ≤10^9

Source

from cqbz
 
 
 
这道题的思路就是拆分火车+set维护
这次真的是学了一遍如何用set了QAQ(5555)
首先因为一辆火车有Ci的容量,我们就直接拆分出Ci辆火车
然后这道题其实是一道贪心的题目
如何贪心呢,首先我们发现一个东西就是火车的起点都是一样的。都是0,所以我们可以把这个铁轨倒着来进行贪心,emmm,就是这么神奇
然后我们找出每一个人,首先我们明显知道如果铁轨是倒着来的话明显上车(倒过来是下车)的人如果越后面上车,占用的资源是最少的
所以我们要把每个人按照起点进行排序
现在开始惊天地泣鬼神的贪心:
我们遍历一遍每个人,找出是否存在火车满足这个人的终点(倒过来是起点)是小于某一辆车子的,如果成立的话就代表这一段可以有人乘坐
接着因为这一辆车的这一段是被占用了,所以我们就要删除这一个车辆,加上一辆新的起点是0,终点是a的车子(因为前面被人占用了,即使后面有一段是空缺的因为起点单调的原因是不会冲突的)
至于怎么用multiset维护,看我的代码吧,我感觉迭代器还是很难以理解,但是很好用的
我觉得还是一道贪心的好题目!!!!
code:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<set>
 4 #include<algorithm>
 5 using namespace std;
 6 multiset<int>q;
 7 struct node{
 8     int s,t;
 9 }peo[100005];
10 bool cmp(node a,node b){
11     return a.s>b.s;
12 }
13 int s[100005],c[100005]; 
14 int main(){
15     int n,m;
16     cin>>n>>m;
17 //    set<int>q;
18 //    set<int>::iterator it;
19 //    for(it=q.begin();it!=q.end();it++){
20 //        int x=*it;
21 //    }
22     for(int i=1;i<=n;i++){
23         cin>>s[i]>>c[i];
24         for(int j=1;j<=c[i];j++)
25             q.insert(s[i]);    
26     }
27     for(int i=1;i<=m;i++)
28         cin>>peo[i].s>>peo[i].t;
29     sort(peo+1,peo+m+1,cmp);
30     int ans=0;
31     for(int i=1;i<=m;i++){
32         int x=peo[i].s,y=peo[i].t;
33         if(q.lower_bound(y)!=q.end()){
34             set<int>::iterator it=q.lower_bound(y);
35             q.erase(it);
36             q.insert(x);
37             ans++;
38         }
39     }
40     cout<<ans;
41     return 0;
42 } 

over

posted @ 2018-09-26 22:15  saionjisekai  阅读(66)  评论(0编辑  收藏  举报