【BZOJ4099】Trapped in the Haybales Gold

Description

Farmer John has received a shipment of N large hay bales (1≤N≤100,000), and placed them at various locations along the road leading to his barn. Unfortunately, he completely forgets that Bessie the cow is out grazing along the road, and she may now be trapped within the bales!
Each bale j has a size Sj and a position Pj giving its location along the one-dimensional road. Bessie the cow can move around freely along the road, even up to the position at which a bale is located, but she cannot cross through this position. As an exception, if she runs in the same direction for D units of distance, she builds up enough speed to break through and permanently eliminate any hay bale of size strictly less than D. Of course, after doing this, she might open up more space to allow her to make a run at other hay bales, eliminating them as well.
Bessie can escape to freedom if she can eventually break through either the leftmost or rightmost hay bale. Please compute the total area of the road consisting of real-valued starting positions from which Bessie cannot escape.
农民约翰收到了N个干草包(1≤N≤100000),并将它们放置在一条道路上的
不同位置。不幸的是,他忘记了贝西是沿着道路放牧,她现在可能被困在干
草包里了! 
每个包有一个大小Sj和位置Pj。贝西可以沿着道路自由走动,甚至可以
到达一捆草包所在的位置,但她必须通过这个位置。如果她向同一方向跑D单
位的距离,她就可以突破大小严格小于D的干草包。当然,这样做后她就可以
开发出更广阔的空间,突破其他干草包。 
如果贝西可以突破最左边或最右边的干草包,她就可以重获新生。请计
算贝西无法逃脱的道路的面积。 

Input

The first line of input contains N. Each of the next N lines describes a bale, and contains two integers giving its size and position, each in the range 1…10^9. All positions are distinct.
输入的第一行包含一个整数N。以下N行每行描述一捆干草包,包含两个
整数,分别表示它的大小和位置,每个数的范围是1...10^9。所有的位置是不同
的。 

Output

Print a single integer, giving the area of the road from which Bessie cannot escape.
 
输出一个整数,表示贝西无法逃脱的道路面积。 

Sample Input

5
8 1
1 4
8 8
7 15
4 20

Sample Output

14

题解:这种思路题果然难搞,无奈上官网看的题解。

如果我们将干草堆按坐标排序,对于某段区间[i,j],加入Bessie能突破[i+1,j-1]内的所有干草,但是就是突破不了[i,j],那就说明[i,j]里面一定没有比i,j更大的干草堆

因此,我们将干草堆按大小从大到小排序,一个一个加到坐标轴上,每加入一个干草堆,就找到它的前驱和后继,并分别判断这两段区间能否突破,如果不能,将区间标记一下就好了(我比较懒用的差分数组来打标记)

前驱后继可以用set来维护,但注意查询到前驱后继时我们还需要知道前驱后继的干草堆大小,这个记录一下排在第i位(按坐标排序)的干草堆编号就行了

#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int maxn=100010;
int h[maxn],x[maxn],rx[maxn],rh[maxn];
bool cmp1(int a,int b)
{
return x[a]<x[b];
}
bool cmp2(int a,int b)
{
return h[a]>h[b];
}
int s[maxn],sum;
int n,ref[maxn],ans;
set <int> ms;
int main()
{
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++) scanf("%d%d",&h[i],&x[i]),rx[i]=rh[i]=i;
//rx,rh存储的其实是编号,我们是在将编号排序
sort(rx+1,rx+n+1,cmp1);
for(i=1;i<=n;i++)
{
ref[i]=x[rx[i]];
x[rx[i]]=i;
}
sort(rh+1,rh+n+1,cmp2);
set<int>::iterator it;
for(i=1;i<=n;i++)
{
it=ms.lower_bound(x[rh[i]]);
if(it!=ms.begin()&&!ms.empty())
{
it--;
j=rx[*it];
if(ref[x[rh[i]]]-ref[x[j]]<=min(h[rh[i]],h[j]))
{
s[x[j]]++;
s[x[rh[i]]]--;
}
}
it=ms.upper_bound(x[rh[i]]);
if(it!=ms.end())
{
j=rx[*it];
if(ref[x[j]]-ref[x[rh[i]]]<=min(h[rh[i]],h[j]))
{
s[x[rh[i]]]++;
s[x[j]]--;
}
}
ms.insert(x[rh[i]]);
}
for(i=1;i<=n;i++)
{
ans+=(sum>0)*(ref[i]-ref[i-1]);
sum+=s[i];
}
printf("%d",ans);
return 0;
}

【BZOJ4099】Trapped in the Haybales Gold STL的更多相关文章

  1. 【leetcode】1219. Path with Maximum Gold

    题目如下: In a gold mine grid of size m * n, each cell in this mine has an integer representing the amou ...

  2. 【Codeforces752D】Santa Claus and a Palindrome [STL]

    Santa Claus and a Palindrome Time Limit: 20 Sec  Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...

  3. 【UVA】12504 Updating a Dictionary(STL)

    题目 题目     分析 第一次用stringstream,真TMD的好用     代码 #include <bits/stdc++.h> using namespace std; int ...

  4. 【pat】C++之刷题常用STL容器整理

    1.vector 动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图). 头文件 #include<vec ...

  5. P1450 包裹快递 RP+14【二分】

    [题目链接]:https://vijos.org/p/category/%E5%85%B6%E4%BB%96,%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE 描述 一个快递公 ...

  6. 【BZOJ4101】[Usaco2015 Open]Trapped in the Haybales Silver 二分

    [BZOJ4101][Usaco2015 Open]Trapped in the Haybales (Silver) Description Farmer John has received a sh ...

  7. 【BZOJ】1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    [题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i] ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 【POJ3169 】Layout (认真的做差分约束)

    Layout   Description Like everyone else, cows like to stand close to their friends when queuing for ...

随机推荐

  1. iOS彩票项目--第六天,运用MVC思想搭建设置界面(非storyboard方法)

    一.我只想说封装的思想很重要,MVC的思想也很重要,利用MVC思想搭建一下的界面 先说显示出来的cell,有三种(图中的两种,还有一种是最普通的,没有图片的),这种显示不同的cell,交给模型来处理, ...

  2. Linux - tar命令 压缩 和 解压

    压缩 tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后 ...

  3. 事件总线demo

    经过几天的努力拜读大牛高手文章,终于对事件总线有所了解,特此记录下来,以免忘记 1.定义相关的接口: A  事件接口 public interface IDomainEvent { DateTime ...

  4. TensorFlow基础笔记(0) tensorflow的基本数据类型操作

    import numpy as np import tensorflow as tf #build a graph print("build a graph") #生产变量tens ...

  5. python读写word文档

    读: from docx import Document dir_docx = 'F:\Eclipse\workspace\Spider\cnblogs_doc\mytest - 副本.docx' d ...

  6. asp.net MVC提高开发速度(创建项目模板)

  7. $.ajax的一般用法

    $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax() 一.$.ajax的一般格式 $.ajax({ type: 'POST', url: url , ...

  8. iOS 图片切片的简单实现

    图片切片就是将一张图片按一定比例切分,中间部分系统自动填充空白, 这样在文本多行输入的时候,将具有特定形状的图片作为背景, 即使文本行数很多,也不会使图片走形. //即使你按5/5分,还是3/7分系统 ...

  9. 感谢各位亲们的大力支持,免费的HTML5学习课程《HTML5网页开发实例具体解释》连载已经结束了!

    感谢各位亲们的大力支持,免费的HTML5学习课程<HTML5网页开发实例具体解释>连载已经结束了.  有兴趣的读者能够看我的博客,也能够看以下的链接逐个学习: 当里个当.免费的HTML5连 ...

  10. Git 基础 - 查看提交历史

    查看提交历史 在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源 ...