题目描述:
最近下了很大的雨,小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;
}