High bridge, low bridge

题目描述:

最近下了很大的雨,小P都不能开心的出去玩耍了。所以无聊的小P找事来了。
在这些天总共下了很多次雨,每次下雨后,河的水位都会上升一些,然后雨过后水位又会下降到一定位置。在这个河上有许多桥,小P想知道在这些雨过后,有多少桥被淹没不少于k次。
如果桥的位置高于当前水位,洪水来后,水位上涨,将桥淹没(水位与桥同等高度也理解为桥被淹没),则计为该桥被淹没一次。第一次洪水来临前,水位为1。
如果你还没有理解,可以看一下下面:
两座桥的高度分别为2和5,水位初始为1
第一次洪水水位上涨到6,两座桥都被淹没一次,然后水位下降到2
第二次洪水水位上涨到8,高度为5的桥被淹了(高度为2的在水里,所以没被又一次淹没),然后水位下降到3
所以两座桥被淹没的次数分别为1 2。

输入:

输入最多包含25组样例。每组样例第一行包括三个整数n、m、k,(1<=n,m,k<=105)分别表示桥的数量,洪水来临的次数,和被淹没不少于k次。接下来一行包含n个整数,hi表示第i座桥的高度(2<=hi<=108)。接下来m行,每行两个整数ai,bi(1<=bi < ai <10^8 , ai>bi-1),分别代表洪水来时的水位高度和洪水退时水位的高度。输入文件大小不超过5MB。

输出:

对于每个样例输出一行,形式如"Case z: ans",其中z为样例编号,ans为被淹没不少于k次的桥的数量。
解释:第二个样例,桥被淹没的次数分别为1 2 3 2 0。

样例输入:

2 2 2
2 5
6 2
8 3
5 3 2
2 3 4 5 6
5 3
4 2
5 2

样例输出:

Case 1: 1
Case 2: 3

code:

思路:
二分找到在洪水蔓延上来被淹没的区间,然后赋值,最后统计一下即可

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+50;
int n,m,k;
long long a[maxn];
int timee[maxn];
int main()
{
	int ttt=1;
	while(~scanf("%d%d%d",&n,&m,&k))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a,a+n);
		memset(timee,0,sizeof(timee));
		int x,y;
		scanf("%d%d",&x,&y);
		int num=0;
		int pos=lower_bound(a,a+n,x)-a;
		for(int i=0;i<pos;i++)
		{
			timee[i]++;
			if(timee[i]==k)num++;
		}
		for(int kk=1;kk<m;kk++)
		{
			int posl=lower_bound(a,a+n,y)-a;
			scanf("%d%d",&x,&y);
			int pos2=lower_bound(a,a+n,x)-a;
			for(int i=posl;i<pos2;i++)
			{
				timee[i]++;
				if(timee[i]==k)num++;
			}
		}
		printf("Case %d: %d\n",ttt++,num);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值