51nod 1460:连接小岛 贪心二分
2016-02-15 23:26
337 查看
1460 连接小岛
题目来源: CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
有n个小岛,每一个小岛是直线型的,他们不相互相交,第i个小岛所占的区间是[li, ri],而且, ri < li+1 对于所有的 1
≤ i ≤ n-1。现在要将相邻的小岛用桥连接起来。现在有一条桥的长度是a,第i个岛和第i+1个岛能够连接的条件是,存在x,y使得 li ≤ x ≤ ri, li+1 ≤ y ≤ ri+1 且 y -
x = a成立。
现在有m条桥,每条桥最多被使用一次,问能否把这些岛连接起来。
样例解释:在这个样例中,把第2条桥两个端点放在3和8,把第三条桥两个端点放在7和10,把第一条桥的端点放在10和14。
Input
Output
Input示例
Output示例
一开始考虑优先队列,后来发现思路不对,还是对于每一个岛之间的距离贪心搞对,按照上限的大小排序之后,不断找大于这个距离下限的最小值,跟别人讨论的时候在想如何二分这个条件,然后删除这个桥。主要是自己之前也没有用过multiset,发现这个搞一些动态的数据挺好用的。
代码:
题目来源: CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
有n个小岛,每一个小岛是直线型的,他们不相互相交,第i个小岛所占的区间是[li, ri],而且, ri < li+1 对于所有的 1
≤ i ≤ n-1。现在要将相邻的小岛用桥连接起来。现在有一条桥的长度是a,第i个岛和第i+1个岛能够连接的条件是,存在x,y使得 li ≤ x ≤ ri, li+1 ≤ y ≤ ri+1 且 y -
x = a成立。
现在有m条桥,每条桥最多被使用一次,问能否把这些岛连接起来。
样例解释:在这个样例中,把第2条桥两个端点放在3和8,把第三条桥两个端点放在7和10,把第一条桥的端点放在10和14。
Input
单组测试数据。 第一行有两个整数n (2 ≤ n ≤ 2*10^5) 和 m (1 ≤ m ≤ 2*10^5),表示岛的数目和桥的数目。 接下来n行,每行有两个整数 li 和 ri (1 ≤ li ≤ ri ≤ 10^18),表示岛的两个端点。 接下来一行有m个整数 a1, a2, ..., am (1 ≤ ai ≤ 10^18),表示每一条桥的长度。
Output
如果能够将n座岛连接起来输出YES,否则输出NO。
Input示例
4 4 1 4 7 8 9 10 12 14 4 5 3 8
Output示例
YES
一开始考虑优先队列,后来发现思路不对,还是对于每一个岛之间的距离贪心搞对,按照上限的大小排序之后,不断找大于这个距离下限的最小值,跟别人讨论的时候在想如何二分这个条件,然后删除这个桥。主要是自己之前也没有用过multiset,发现这个搞一些动态的数据挺好用的。
代码:
#pragma warning(disable:4996) #include <iostream> #include <functional> #include <algorithm> #include <cstring> #include <vector> #include <string> #include <cstdio> #include <cmath> #include <queue> #include <stack> #include <deque> #include <ctime>; #include <set> #include <map> using namespace std; typedef long long ll; #define INF 0x3fffffff #define rep(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) const ll mod = 1e9 + 7; const int maxn = 2e5 + 5; struct no { ll le, ri, id; bool operator<(const no &n1) { if (ri == n1.ri) { return le < n1.le; } else { return ri < n1.ri; } } }island[maxn],node[maxn]; int n, m, nx; ll res[maxn]; multiset<pair<ll, int>>bridge; multiset<pair<ll, int>>::iterator it; void input() { int i, j; ll t; scanf("%d%d", &n, &m); for (i = 1; i <= n; i++) { scanf("%I64d%I64d", &island[i].le, &island[i].ri); } nx = 0; for (i = 2; i <= n; i++) { nx++; node[nx].le = island[i].le - island[i - 1].ri; node[nx].ri = island[i].ri - island[i - 1].le; node[nx].id = nx; } sort(node + 1, node + nx + 1); for (i = 1; i <= m; i++) { scanf("%I64d", &t); bridge.insert({ t,i }); } } void solve() { int i, j; for (i = 1; i <= nx; i++) { it = bridge.lower_bound({ node[i].le,0 });//求出大于等于node[nx].le的第一个值 if (it == bridge.end() || it->first > node[i].ri) { puts("NO"); return; } res[node[i].id] = it->second; bridge.erase(it); } puts("YES"); /*for (i = 1; i <= nx; i++) { printf("%d ", res[i]); }*/ return; } int main() { //freopen("i.txt", "r", stdin); //freopen("o.txt", "w", stdout); input(); solve(); return 0; }
相关文章推荐
- python实现快速排序
- 缓存
- Atitit.获取approot api 应用根路径 java c#.net php asp
- 【转】Xcode方法提示不显示的解决办法
- The Data Scientist's Toolbox -- markdown基础
- C语言实现线性链表的19个功能
- Facebook开源动画库 POP-POPSpringAnimation运用
- 【追加】发布器 评论框 前端
- HDU 5584 LCM Walk
- BestCoder Round #72 (div.2) 总结
- 20160215自学Linux_计算机硬件基础
- Shopping Offers
- 什么叫真正的IT男?
- 1070. Mooncake (25)
- 数据库设计的步骤
- iOS 【UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧】
- BZOJ 3238 AHOI 2013 差异 后缀数组 单调
- 06-mac截图
- 简单目录操作,几个重要的结构体
- android总览