题意:按顺序给出多个互不相交的区间(表示一些小岛),和一些可以连接区间的桥,每个桥有固定的长度。区间和桥的数量都是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的更多相关文章

  1. CF555B 贪心

    http://codeforces.com/problemset/problem/555/B B. Case of Fugitive time limit per test 3 seconds mem ...

  2. CF555B Case of Fugitive

    题目大意 有一些不相交线段和一些桥,桥可以架在两个相邻的线段上.求现有的桥是否可以使所有线段连通. 题解 在两个线段上架桥,桥的长度在一个范围内,相当于一个长度的区间,一个桥只有一个长度,相当于一个长 ...

随机推荐

  1. Java多线程编程核心技术--定时器

    Timer类主要负责计划任务,也就是在指定的时间开始执行某一个任务. 方法schedule(TimerTask task, Date time) public class Task { private ...

  2. QQ空间HD(4)-设置左侧菜单栏属性

    DJHomeViewController.m #import "DJHomeViewController.h" #import "DJMenuView.h" ; ...

  3. 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

    1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...

  4. Java Programming Test Question 2

    public class JPTQuestion2 { public static void main(String[] args) { String s3 = "JournalDev&qu ...

  5. [译]AngularJS Service vs Factory - Once and for all

    原文: http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html Service和Fa ...

  6. pyspider安装

    官方文档上说的比较简单: pip install pyspider 但是实际安装时还是有些问题导致无法成功. windows下安装 先安装PhantomJS 可以依照自己的开发平台选择不同的包进行下载 ...

  7. 【bzoj4027】[HEOI2015]兔子与樱花

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  8. 【bzoj1864】[ZJOI2006]三色二叉树

    题目描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 样例输出 ...

  9. php访问全局变量

    函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. PHP 同时在名为 $GLOBALS[index] 的数组 ...

  10. PowerDesigner的使用(一)

    一. PowerDesigner 功能 1. 需求管理:记录需求,分析设计模型 2. 生成文档:生成HTML格式文档,方便沟通. 3. 影响度分析:模型之间连接起来,同步修改功能. 4. 数据映射:提 ...