Q: There are one high bridge and one low bridge across the river. The river has flooded twice, why the
high bridge is flooded twice but the low bridge is flooded only once?
A: Because the lower bridge is so low that it’s still under water after the first flood is over.
If you’re confused, here’s how it happens:
? Suppose high bridge and low bridge’s heights are 2 and 5, respectively, and river’s initial water
level is 1.
? First flood: the water level is raised to 6 (Both bridges are flooded), and then back to 2 (high
bridge is not flooded anymore, but low bridge is still flooded).
? Second flood: the water level is raised to 8 (The high bridge is flooded again), and then back to
3.
Just a word game, right? The key is that if a bridge is still under water (i.e. the water level is no
less than the bridge height) after a flood, then next time it will not be considered flooded again.
Suppose the i-th flood raises the water level to ai and then back to bi
. Given n bridges’ heights,
how many bridges are flooded at least k times? The initial water level is 1.
Input
The input contains at most 25 test cases. Each test case begins with 3 integers n, m, k in the first line
(1 ≤ n, m, k ≤ 105
). The next line contains n integers hi
, the heights of each bridge (2 ≤ hi ≤ 108
).
Each of the next m lines contains two integers ai and bi (1 ≤ bi < ai ≤ 108
, ai > bi?1). The file size of
the whole input does not exceed 5MB.
Output
For each test case, print the number of bridges that is flooded at least k times.
Explanation:
For the second sample, 5 bridges are flooded 1, 2, 3, 2, 0 times, respectively.
Sample Input
2 2 2
2 5
6 2
8 3
5 3 2
2 3 4 5 6
5 3
4 2
5 2
Sample Output
Case 1: 1
Case 2: 3
被玩了文字游戏….
可能是我理解能力有问题,wa了好多次
关键是在于这个“又”淹没!!
#include<cstdio>
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
/*
Name:
Copyright:
Author:
Date: 07/05/16 21:29
Description:
*/
const int maxn=100005;
int c[maxn<<2];
int a[maxn];
int low(int ns){
return ns&(-ns);
}
int n;
void updata(int x,int y){
while(x<=n){
c[x]+=y;
x+=low(x);
}
}
int sum(int x){
int ans=0;
while(x){
ans+=c[x];
x-=low(x);
}
return ans;
}
int w[maxn][2];
int main(){
int m,k;
int coun=0;
#ifndef ONLINE_JUDGE
freopen("h.in","r",stdin);
freopen("outh.txt","w",stdout);
//freopen("hin.txt","r",stdin);
#endif
while(scanf("%d%d%d",&n,&m,&k)!=-1){
for(int i=1;i<=n;++i)
scanf("%d",a+i);
sort(a+1,a+n+1);
memset(c,0,sizeof(c));
w[0][0] = 1;
for(int i=0; i<m; i++){
scanf("%d%d",&w[i][1],&w[i+1][0]);
}
for(int i=0;i<m;++i){
int poss=upper_bound(a+1,a+n+1,w[i][1])-a-1;
int post=upper_bound(a+1,a+n+1,w[i][0])-a;
// cout<<"pos="<<post<<" "<<poss<<endl;
updata(post,1);
updata(poss+1,-1);
}
int ans=0;
for(int i=1;i<=n;++i){
if(sum(i)>=k)++ans;
// cout<<sum(i)<<endl;
}
printf("Case %d: %d\n",++coun,ans);
}
return 0;
}