[USACO1.2] 挤牛奶Milking Cows
题目描述
三个农民每天清晨 5 5 5 点起床,然后去牛棚给三头牛挤奶。
第一个农民在 300 300 300 秒 (从 5 5 5 点开始计时) 给他的牛挤奶,一直到 1000 1000 1000 秒。第二个农民在 700 700 700 秒开始,在 1200 1200 1200 秒结束。第三个农民在 1500 1500 1500 秒开始, 2100 2100 2100 秒结束。
期间最长的至少有一个农民在挤奶的连续时间为 900 900 900 秒 (从 300 300 300 秒到 1200 1200 1200 秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为 300 300 300 秒 (从 1200 1200 1200 秒到 1500 1500 1500 秒)。
你的任务是编一个程序,读入一个有 n n n 个农民挤 n n n 头牛的工作时间列表,计算以下两点(均以秒为单位):
最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。(从有人挤奶开始算起)
输入格式
第一行一个正整数 n n n
接下来 n n n 行,每行两个非负整数 l , r l,r l,r,表示一个农民的开始时刻与结束时刻。
输出格式
一行,两个整数,即题目所要求的两个答案。
样例 #1
样例输入 #1
3
300 1000
700 1200
1500 2100
样例输出 #1
900 300
提示
【数据范围】
对于
100
%
100\%
100% 的数据,
1
≤
n
≤
5000
1\le n \le 5000
1≤n≤5000,
0
≤
l
≤
r
≤
1
0
6
0 \le l \le r \le 10^6
0≤l≤r≤106。
题目翻译来自NOCOW。
USACO Training Section 1.2
AC代码:
#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
//#define x first
//#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
//const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1e6 + 10;
vector<PII>p, q;
int n;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
int l, r;
cin >> l >> r;
p.push_back({l, r});
}
sort(p.begin(), p.end());
int st = -2e9, ed = -2e9;
for(auto s : p)
{
if(ed < s.first)//已经无重复区间了
{
if(st != -2e9) q.push_back({st, ed});
st = s.first, ed = s.second;
}
else ed = max(ed, s.second);
}
if(st != -2e9) q.push_back({st, ed});//注意最后可能还没有用完
int minn = -INF, maxs = -INF;
sort(q.begin(), q.end());
for(int i = 0; i < q.size(); i ++)
{
if(i != q.size() - 1)
minn = max(minn, q[i + 1].first - q[i].second);
maxs = max(q[i].second - q[i].first, maxs);
}
// cout << q.size() << endl;
// for(int i = 0; i < q.size(); i ++)
// {
// cout << q[i].first << " " << q[i].second << endl;
// }
if(minn != -INF)
cout << maxs << " " << minn << endl;
else cout << maxs << " " << 0 << endl;
return 0;
}