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;
}

 

posted @ 2016-04-10 11:11  Kurokey  阅读(236)  评论(0编辑  收藏  举报