cf555b
题意:按顺序给出多个互不相交的区间(表示一些小岛),和一些可以连接区间的桥,每个桥有固定的长度。区间和桥的数量都是2*10^5。
两个相邻的小岛之间的桥的长度必须小于等于最远点距离,大于等于最近点距离。问是否能用这些桥把所有小岛连接在一起。
分析:区间排序问题。但是这个题里需要排序的区间并不是题里直接给出的小岛。而是要先把桥从小到大排序。
然后对于每两个相邻小岛,在这个桥的序列里都有一个区间内的桥是可以用来连接这两个小岛的。
对于每两个相邻小岛,求出其对应的桥区间,然后把这些区间排序。
排序规则是先按右边缘从小到大,右边相同的按左边缘从小到大。
排序后依次在这些区间里选取对应的桥,每次选取区间内最小的未被使用的桥即可。
至于排序的时候为什么先又后左,是因为不同区间对于左侧的桥资源的迫切程度,肯定是右边缘越偏左,需求越迫切。
所以应当优先将左侧的资源分配给右边缘比较偏左的区间。
要求一个数字集合里面位于一个区间内的最小值,可以用lower_bound函数。
而依次删除使用过的桥,可以用multiset(它有lower_bound这个成员函数)。
当想要使用包含三个值的结构体的时候,可以用两个pair嵌套。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std; #define d(x) const int MAX_N = * (int)(1e5) + ; pair<long long, long long> island[MAX_N];
int bridge_num;
int island_num;
int ans[MAX_N];
pair<long long, pair<long long, int> > range[MAX_N];
multiset<pair<long long, int> > bridge; bool ok()
{
for (int i = ; i < island_num - ; i++)
{
long long l = range[i].second.first;
long long r = range[i].first;
__typeof(bridge.begin()) it = bridge.lower_bound(make_pair(l, -));
if (it == bridge.end())
return false;
if ((*it).first > r)
return false;
ans[range[i].second.second] = it->second;
bridge.erase(it);
}
return true;
} void input()
{
scanf("%d%d", &island_num, &bridge_num);
for (int i = ; i < island_num; i++)
{
long long a, b;
cin >> a >> b;
island[i] = make_pair(a, b);
}
for (int i = ; i < bridge_num; i++)
{
long long a;
cin >> a;
bridge.insert(make_pair(a, i));
}
} int main()
{
input(); for (int i = ; i < island_num - ; i++)
{
long long min_len = island[i + ].first - island[i].second;
long long max_len = island[i + ].second - island[i].first;
range[i] = make_pair(max_len, make_pair(min_len, i));
} sort(range, range + island_num - ); if (ok())
{
puts("Yes");
for (int i = ; i < island_num - ; i++)
{
if (i != )
putchar(' ');
printf("%d", ans[i] + );
}
putchar('\n');
}
else
puts("No");
return ;
}
cf555b的更多相关文章
- CF555B 贪心
http://codeforces.com/problemset/problem/555/B B. Case of Fugitive time limit per test 3 seconds mem ...
- CF555B Case of Fugitive
题目大意 有一些不相交线段和一些桥,桥可以架在两个相邻的线段上.求现有的桥是否可以使所有线段连通. 题解 在两个线段上架桥,桥的长度在一个范围内,相当于一个长度的区间,一个桥只有一个长度,相当于一个长 ...
随机推荐
- C# 正则分组捕获
分组语法 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp ...
- Java中native关键字
Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546) 今日在hibernate源代码中遇到了nati ...
- c# 日期函数[string.Format----GetDateTimeFormats]格式 .【转帖备查】
DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Text = dt.ToFileTi ...
- strtr函数的用法
http://php.net/manual/en/function.strtr.php <?php $trans = array("h" => "-" ...
- php开发总结
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=shared,mys ...
- button 按钮
<!DOCTYPE html> <html> <body> <h1>我的第一段 JavaScript</h1> <p> Java ...
- 谈谈使用echarts过程中踩过的坑
小结: 1. 使用jquery获取json对象遇到的问题 由于自己对ajax用的还不熟练,之前都是拷贝别人的代码拿来用的,这次自己写的时候倒是碰到好多麻烦一一列举如下: 1.1 在$ 与ajax之间还 ...
- Mac Pro 编译安装 PHP 5.6.21 及 问题汇总
[系统环境] 操作系统:OS X 10.11.5 Xcode:7.3.1 [注意] 编译之前,需要安装 xcode.Homebrew 套件! Mac Pro 安装 Homebrew 软件包管理工具 1 ...
- JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- IE8 margin: auto 无法居中
需要给body元素添加属性 body { text-align: center; width: 100%; } ok,可以正常居中.