岛屿(洛谷 U5399)

题目背景

放假了,Lkw和mm到岛上旅游。阳光明媚,风景秀丽。正当Lkw和mm享受眼前这旖旎的风光时,突降大雨,小岛上开始积水,没过几分钟,水便快要触及膝盖。Lkw和mm意识到了事态的严重性,赶紧向高地跑去,可在涌动的人流中,Lkw和mm失散了...水越涨越高,Lkw拿着望远镜四处寻找,耳边不停地传来mm的呼喊,可就是不见mm的身影……焦急的Lkw想知道mm可能在几个区域,你能帮助他么?

题目描述

从水平方向看,我们把岛屿分成n个小块,每个部分用一个数h表示高度,每个区域由相连的小块组成。一开始,水位为0,整个岛屿只有一个区域,在水上涨的过程中,某些小块会被淹没,这样原本相连的区域就会变成多个,假设每个时刻水位会上涨1,现在Lkw想知道q个时刻的情况。

输入输出格式

输入格式:

 

输入第一行包含一个整数n

第二行包含n个整数,分别表示每个小块的高度

第三行包含一个整数q

第四行包含q个整数,表示要询问的q个时刻。

 

输出格式:

 

输出共包含q行,每行表示该时刻mm可能在的区域有几个。

 

输入输出样例

输入样例#1:
7
1 2 3 1 2 1 3
3
1 2 3
输出样例#1:
3
2
0

说明

对于30%的数据n<=1000 q<=1000

对于100%的数据n<=100000 q<=100000 h<=109

输入保证q单调递增

/*
  将数列按照高度排序,先计算出一个开始时的区域数ans,当要下落的石块左右两边都已经下落时,ans--;当要下落的石块的左右两边都没下落时,ans++。
  第一遍做只考虑了下落的那个时刻,没考虑其他时刻,WA了。 
*/
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std;
int n,tmp,now=1,ans=1;
struct node
{
    int h;
    int x;
    bool operator < (node t)const
    {
        return t.h>h;
    }
};node a[N];
bool flag[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>tmp;
        a[i].h=tmp;
        a[i].x=i;
        flag[i]=1;
    }
    sort(a+1,a+n+1);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>tmp;
        while(a[now].h<=tmp&&now<=n)
        {
            int t=-1,x=a[now].x;
            if(x>1&&flag[x-1]) t++;
            if(x<n&&flag[x+1]) t++;
            ans+=t;
            flag[x]=0;
            now++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2016-10-16 21:19  karles~  阅读(313)  评论(0编辑  收藏  举报