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下车。由于火车的容量限制,请你求出最多有多少人的乘车需求可以得到满足。
对任意车站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个乘客的乘车区间。
接下来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
∙对于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