【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. linux实现防止恶意扫描 PortSentry

    linux实现防止恶意扫描 PortSentry   脚本 open 摘要: 端口做为服务器的大门安全很重要,当服务器运行很多服务时并向外提供服务,为防止有人恶意侦测服务器用途,可使用portsent ...

  2. 上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题

    Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar typ ...

  3. -27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found

    LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止. 错误现象:Action.c(41): Error -27979: Request ...

  4. ffmpeg笔记——UDP组播接收总结

    ffmpeg在avformat_open_input里面已经实现了UDP的协议,所以只需要设置好参数,将url传递进去就可以了. 和打开文件的方式基本一样: 01 AVCodecContext *pV ...

  5. 平时收集的一些有关UED的团队和个人博客(转)

    UCDChina导航 前端团队 阿里巴巴 UED -- 我们设计的界面,并没有几十亿的流量,但每天来自上百个国家的百万商人在使用着. 阿里巴巴中国站UED -- 阿里巴巴中国站UED成立于1999年, ...

  6. CentOS运维常用管理操作命令

    自己整理的整理Linux常用运维和linux常用管理操作命令,当然不是非常详细和丰富,但是也基本上够用了吧.欢迎留言补充更多的Linux常用运维和linux常用管理操作命令.不断完善中.... 备份m ...

  7. js计算两个时间相差天数

     //两个时间相差天数 兼容firefox chrome    function datedifference(sDate1, sDate2) {    //sDate1和sDate2是2006-12 ...

  8. 详解ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...

  9. ftp命令行工具如何 连接 非标准21端口(其他端口)的ftp服务器

    windows: step1:ftp命令进入ftp交互环境 step2:ftp>open ip空格port 然后...

  10. css文字超出自动显示省略号

    只针对单行文本有效: 01.针对块状元素 ul li{ width: 180px; text-overflow: ellipsis; white-space: nowrap;/*禁止自动换行*/ ov ...