描述 Description
约翰的牛们认为, 太阳升起的那一刻是一天中最美好的, 在那时她们可以看到远方城市模糊的轮廓.显然, 这些轮廓其实是城市里建筑物模糊的影子.
建筑物的影子实在太模糊了, 牛们只好把它们近似地看成若干个边长为 1 单位长度的正方体整齐地叠在一起.城市中的所有建筑物的影子都是标准的矩形.牛们的视野宽 W(l ≤ W ≤ 106 )个单位长度,不妨把它们接从左到右划分成 W 列,并按 1 到 W 编号.建筑物的轮廓用 N(l ≤ N ≤ 50000)组数给予描述,每组数包含 2 个整数 x, y(l ≤ x ≤ W , 0 ≤ y ≤ 500000),表示从第 x 列开始,建筑物影子的高度变成了 y. 也就是说, 第 xi 列到第 xi+l-1 列中每一列建筑物影子的高度都是 yi 个单位长度.
贝茜想知道这座城市里最少有多少幢建筑物,也就是说, 这些影子最少可以由多少个矩形完全覆盖.当然,建筑物的影子可以有重叠.请你写一个程序帮她计算一下. 城市的轮廓可能是这样:
……………………..
…..XX………XXX…….
.XXX.XX…….XXXXXXX…..
XXXXXXXXXX….XXXXXXXXXXXX
于是它可以用 (1,1), (2,2), (5,1), (6,3), (8,1), (11,0), (15,2), (17,3), (20,2), (22,1) 这 10 组数进行描述.不难看出, 这座城市里最少有 6 幢建筑物.以下是这些建筑物的一种分布的可能:
……………………..||……………………..||……………………..
…..22………333…….||…..XX………XXX…….||…..XX………XXX…….
.111.22…….XX333XX…..||.XXX.XX…….5555555…..||.XXX.XX…….XXXXXXX…..
X111X22XXX….XX333XXXXXXX||4444444444….5555555XXXXX||XXXXXXXXXX….666666666666
输入格式 InputFormat
第 1 行:2 个用空格隔开的整数 N 和 W.
第 2 到 N+1 行:每行包括 2 个用空格隔开的整数 x,y,其意义如题中所述.输入中的 x 严格递增,并且第一个数总是 x.
输出格式 OutputFormat
输出一个整数,表示城市中最少包含的建筑物数量.
样例输入 SampleInput
10 40
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
样例输出 SampleOutput
10
来源 Source
Silver
代码 Code
额这题跟 BZOJ1628 是一模一样的真的没关系么。。。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int f[1000005];
int i,j,t,n,m,l,r,k,z,y,x,ans;
inline int read()
{
int x=0;char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
int main()
{
n=read();m=read();
ans=0;r=0;f[r]=0;
for (i=1;i<=n;i++)
{
x=read();y=read();
while (f[r]>y)
{
ans++;
r--;
}
if (f[r]==y) continue;
f[++r]=y;
}
while (f[r]>0)
{
ans++;
r--;
}
printf("%d\n",ans);
return 0;
}