51nod 1276 岛屿的数量(思维)

来源:互联网 发布:淘宝怎么买图片空间 编辑:程序博客网 时间:2024/05/17 05:14

这道题需要先排序再对比,然后统一输出答案,不然会超时

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define LL long long#define MOD 1000000007#define M 50010#define INF 0x3f3f3f3fstruct node{    int u, pos;};node no[M], ne[M];bool cmp(node t1, node t2){    return t1.u < t2.u;}int main(){    int n, q, a[M], sum, down, up;    while(scanf("%d%d", &n, &q) != EOF)    {        int top = 0;        down = INF;        up = 0;        for(int i=0; i<n; i++)        {            scanf("%d", &no[i].u);            no[i].pos = i;        }        for(int i=0; i<q; i++)        {            scanf("%d", &ne[i].u);            ne[i].pos = i;        }        sort(ne, ne+q, cmp);        sort(no, no+n, cmp);        int j = 0;        bool vis[M];        memset(vis, 0, sizeof(vis));        sum = 1;        for(int i=0; i<q; i++)        {            while(no[j].u <= ne[i].u && j < n)            {                if(!no[j].pos)                {                    if(vis[1])                    {                        sum--;//最左边且旁边的被淹没                     }                }                else if(no[j].pos == n-1)                {                    if(vis[n-2])                    {                        sum--;//最右边                     }                }                else                {                    if(vis[no[j].pos-1] && vis[no[j].pos+1])//考虑两边都已经被淹                     {                        sum--;                    }                    if(!vis[no[j].pos-1] && !vis[no[j].pos+1])//两边都没有被淹                     {                        sum++;                    }                    //只有只有一边被淹的相当于没有变化                 }                vis[no[j].pos] = 1;//记录被淹的                 j++;            }            a[ne[i].pos] = sum;//记录该询问         }        for(int i=0; i<q; i++)        {            printf("%d\n", a[i]);        }    }    return 0;}
0 0
原创粉丝点击