CodeForces C. Maximal Intersection
http://codeforces.com/contest/1029/problem/C
You are given nn segments on a number line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide.
The intersection of a sequence of segments is such a maximal set of points (not necesserily having integer coordinates) that each point lies within every segment from the sequence. If the resulting set isn't empty, then it always forms some continuous segment. The length of the intersection is the length of the resulting segment or 00 in case the intersection is an empty set.
For example, the intersection of segments [1;5][1;5] and [3;10][3;10] is [3;5][3;5] (length 22), the intersection of segments [1;5][1;5] and [5;7][5;7] is [5;5][5;5](length 00) and the intersection of segments [1;5][1;5] and [6;6][6;6] is an empty set (length 00).
Your task is to remove exactly one segment from the given sequence in such a way that the intersection of the remaining (n−1)(n−1)segments has the maximal possible length.
The first line contains a single integer nn (2≤n≤3⋅1052≤n≤3⋅105) — the number of segments in the sequence.
Each of the next nn lines contains two integers lili and riri (0≤li≤ri≤1090≤li≤ri≤109) — the description of the ii-th segment.
Print a single integer — the maximal possible length of the intersection of (n−1)(n−1) remaining segments after you remove exactly one segment from the sequence.
4
1 3
2 6
0 4
3 3
1
5
2 6
1 3
0 4
1 20
0 4
2
3
4 5
1 2
9 20
0
2
3 10
1 5
7
代码:
#include <bits/stdc++.h>
using namespace std; #define inf 0x3f3f3f3f
const int maxn = 300010 + 10;
int N; struct Node {
int l;
int r;
}S[maxn], Q[maxn], A[maxn]; int main() {
scanf("%d", &N);
S[0].r = inf, S[0].l = -inf;
for(int i = 1; i <= N; i ++) {
scanf("%d%d", &A[i].l, &A[i].r);
S[i].l = max(S[i - 1].l, A[i].l);
S[i].r = min(S[i - 1].r, A[i].r);
} Q[N + 1].r = inf, Q[N + 1].l = -inf;
for(int i = N; i >= 1; i --) {
Q[i].l = max(A[i].l, Q[i + 1].l);
Q[i].r = min(A[i].r, Q[i + 1].r);
} int ans = 0;
for(int i = 1; i <= N; i ++) {
ans = max(ans, (min(Q[i + 1].r, S[i - 1].r) - max(Q[i + 1].l, S[i - 1].l)));
}
printf("%d\n", ans);
return 0;
}
最新文章
- Office 365常见问题解答(第一期)
- play 源码分析
- 请问如何查看mysql 的端口号?
- Sublime Text3 插件集合
- 初试 uTenux
- SDL_Test库(1)——SDL不用TTF库绘制文字
- .net 配置文件 分析 EntityName 时出错
- Handlebars.js 模板引擎
- 利用CocoaHTTPServer实现wifi局域网传输文件到iphone
- js for in循环遍历对象,获取key:value值
- 在Linux下部署mysql时,使用group by碰到的问题
- Bicriterial routing 双调路径 HYSBZ - 1375(分层最短路)
- Zookeeper学习笔记——2 Shell和Java API的使用
- Cocos2d-JS studio基础控件的使用
- 销售vs技术岗,做技术的方法思考
- 京东轮播图片的静态页面CSS3
- asp.net mvc全局异常捕获
- 什么是ZooKeeper(一)(通俗易懂)
- UVA 1262 Password
- Openstack(Kilo)安装系列之Keystone(三)