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语言Hello world
#include"stdio.h" void main() { printf("Hello world!\n"); }
- javascript取一周的日期
上代码: <script> var today = new Date(); for (var i = 0; i < 7; i++) { today.setDate(today.get ...
- High Frequency Trading (整理中...)
什么是高频交易系统 1 交易指令完全是由电脑发送,对市场数据的响应延时在微秒级2 系统有专用的软硬件组成,研发时需要大量的计算机专家级的工作3 系统的硬件需要放在离交易所主机很近的位置,所谓co-lo ...
- jquery点击label触发2次的问题
今天写问卷的时候遇到个label点击的时候,监听的click事件被执行两次:产生这个的原因么...事件冒泡 <div class="questionBox checkBox" ...
- wtforms 使用
wtforms是一个表单模板库, 下面以修改密码表单为例简单说明其用法. 我们可以用python代码定义form的基本元素, 比如用户名/邮箱, 并给定各个元素的validation条件. 然后在re ...
- 网站SEO优化之添加Sitemap文件。
Sitemap.xml 故名思意就是站点地图文件,可以指引Google spider 收录相应网页.正确地使用Google Sitemap,可以确保让Google spider 不遗漏网站内的任何页面 ...
- 清北学堂模拟day6 圆桌游戏
[问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...
- block 块函数
定义模块函数: <?php function smarty_block_text($args,$content,$smarty,$a) { $color=$args["color&qu ...
- Mac 命令
1.du 获取某个目录下各个文件和子目录占用多少空间,可以输入:du -sh *
- button事件驱动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...