Uva12663
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110383#problem/C
题目大意:有一些不同高度的桥,会涨几次水,水流初始高度为1,然后不停的涨潮落潮,求被淹没至少K次的桥的个数(一开始就在水中的桥不增加淹没次数)
题目思路:前缀和离散化
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <cctype> #include <queue> #include <string> #include <vector> #include <set> #include <map> #include <climits> #define lson root<<1,l,mid #define rson root<<1|1,mid+1,r #define fi first #define se second #define ping(x,y) ((x-y)*(x-y)) #define mst(x,y) memset(x,y,sizeof(x)) #define Min(x,y) (x<y?x:y) #define Max(x,y) (x>y?x:y) using namespace std; #define gamma 0.5772156649015328606065120 //欧拉常数 #define MOD 100000007 #define inf 0x3f3f3f3f #define N 100050 #define maxn 10001000 typedef long long LL; typedef pair<int,int> PII; int n,m,k,a[N<<1],res[N<<1],cnt,b[N]; PII p[N]; int main() { int i,j,x,y,v,group,Case=0; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { cnt=0; mst(res,0); for(i=0; i<n; ++i) scanf("%d\n",&b[i]); p[0].fi=2; a[cnt++]=2; for(i=0; i<m; ++i) { scanf("%d%d",&p[i].se,&p[i+1].fi); ++p[i].se; ++p[i+1].fi; a[cnt++]=p[i].se; a[cnt++]=p[i+1].fi; } --cnt; stable_sort(a,a+cnt); cnt=unique(a,a+cnt)-a; for(i=0; i<m; ++i) { int l=lower_bound(a,a+cnt,p[i].fi)-a; int r=lower_bound(a,a+cnt,p[i].se)-a; ++res[l]; --res[r]; } for(i=1; i<cnt; ++i) res[i]+=res[i-1]; int ans=0; for(i=0; i<n; ++i) { int pos=upper_bound(a,a+cnt,b[i])-a-1; if(res[pos]>=k) ++ans; } printf("Case %d: %d\n",++Case,ans); } return 0; }