51NOD 1276 岛屿的数量(脑洞 + 思维)

传送门

有N个岛连在一起形成了一个大的岛屿,如果海平面上升超过某些岛的高度时,则这个岛会被淹没。原本的大岛屿则会分为多个小岛屿,如果海平面一直上升,则所有岛都会被淹没在水下。

给出N个岛的高度。然后有Q个查询,每个查询给出一个海平面的高度H,问当海平面高度达到H时,海上共有多少个岛屿。例如:

岛屿的高度为:{2, 1, 3, 2, 3}, 查询为:{0, 1, 3, 2}。

当海面高度为0时,所有的岛形成了1个岛屿。

当海面高度为1时,岛1会被淹没,总共有2个岛屿{2} {3, 2, 3}。

当海面高度为3时,所有岛都会被淹没,总共0个岛屿。

当海面高度为2时,岛0, 1, 3会被淹没,总共有2个岛屿{3} {3}。

Input

第1行:2个数N, Q中间用空格分隔,其中N为岛的数量,Q为查询的数量(1 <= N, Q <= 50000)。

第2 - N + 1行,每行1个数,对应N个岛屿的高度(1 <= A[i] <= 10^9)。

第N + 2 - N + Q + 1行,每行一个数,对应查询的海平面高度(1 <= Q[i] <= 10^9)。

Output

输出共Q行,对应每个查询的岛屿数量。

Input示例

5 4

2

1

3

2

3

0

1

3

2

Output示例

1

2

0

2

解题思路:

当时看到这个题的时候有点懵,但是后来一分析,觉得应该是水没到山谷的时候,岛屿+1,山峰的时候-1,否则不变。其实就是这个道理,那么我们现在用一个标记数组将所有淹没过的岛屿标记一下,那么在根据上述的分析 就可以写了,但是这样的话 很容易超时,所以我们先将所有的岛屿和要查询的岛屿从小到大排序,在排序之前要记得保留下标,然后判断就行了。这是一个锻炼脑洞的题目。

My Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAXN = 5e4+5;
struct node
{
    int pos, val;
};
node a[MAXN], q[MAXN];
bool cmp(node a, node b)
{
    return a.val < b.val;
}
bool vis[MAXN];
int ans[MAXN];
int main()
{
    int N, Q;
    while(~scanf("%d%d",&N,&Q))
    {
        memset(vis, 0, sizeof(vis));
        for(int i=0; i<N; i++)
        {
            scanf("%d",&a[i].val);
            a[i].pos = i;
        }
        for(int i=0; i<Q; i++)
        {
            scanf("%d",&q[i].val);
            q[i].pos = i;
        }
        sort(a, a+N, cmp);
        sort(q, q+Q, cmp);
        int sum = 1, j = 0 ;
        for(int i=0; i<Q; i++)
        {
            while(a[j].val<=q[i].val && j<N)
            {
                ///判断是不是第一个点
                if(a[j].pos == 0)
                {
                    if(vis[1])
                        sum--;
                }
                ///判断是不是最后一个点
                else if(a[j].pos == N-1)
                {
                    if(vis[N-2])
                        sum--;
                }
                ///中间的点
                else
                {
                    if(vis[a[j].pos-1] && vis[a[j].pos+1])///山峰
                        sum--;
                    else if(!vis[a[j].pos-1] && !vis[a[j].pos+1])///山谷
                        sum++;
                    ///else 不变 就不需要写了
                }
                vis[a[j].pos] = 1;///标记被淹没
                j++;
            }
            ans[q[i].pos] = sum;
        }
        for(int i=0; i<Q; i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}
时间: 2024-07-30 12:57:55

51NOD 1276 岛屿的数量(脑洞 + 思维)的相关文章

51nod 1276 1276 岛屿的数量 (很好玩的题目

题意: 有N个岛连在一起形成了一个大的岛屿,如果海平面上升超过某些岛的高度时,则这个岛会被淹没.原本的大岛屿则会分为多个小岛屿,如果海平面一直上升,则所有岛都会被淹没在水下. 给出N个岛的高度.然后有Q个查询,每个查询给出一个海平面的高度H,问当海平面高度达到H时,海上共有多少个岛屿.例如: 岛屿的高度为:{2, 1, 3, 2, 3}, 查询为:{0, 1, 3, 2}. 当海面高度为0时,所有的岛形成了1个岛屿. 当海面高度为1时,岛1会被淹没,总共有2个岛屿{2} {3, 2, 3}. 当

51Nod 1006 1276 岛屿的数量

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAXN = 5e4+5; 9 struct node 10 { 11 int pos, val; 12 }; 13 node a[MAXN], q[MAXN];

[LeetCode] 200. Number of Islands 岛屿的数量

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by

Leetcode 200.岛屿的数量 - DFS、BFS

Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7MB,99.7% / 92% public: /** * row,col: 坐标,以0开始. * 用row和col,而不是x,y. 否则容易写成grid[x][y],顺序不对!! */ void dfs_set_zero(vector<vector<char>>& grid, i

图-dfs-连通分量-旋转变换-804. 不同岛屿的数量II

2020-04-04 18:25:18 问题描述: 给定一个0和1的非空的二维数组网格,一个岛是一个1(表示陆地)的组,4个方向(水平或垂直)连接.你可以假设网格的所有四条边都被水包围.计算不同岛屿的数量.当一个岛被认为与另一个岛相同时,它们有相同的形状,或在旋转后的形状相同(90,180,或270度)或翻转(左/右方向或向上/向下方向). 样例 Example 1: Input: [[1,1,0,0,0],[1,0,0,0,0],[0,0,0,0,1],[0,0,0,1,1]] Output:

51Nod 1003 阶乘后面0的数量(数学,思维题)

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003编程之美有讲:一个数 n

[LeetCode] Number of Islands II 岛屿的数量之二

A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand operation which turns the water at position (row, col) into a land. Given a list of positions to operate, count the number of islands after each addLand o

51nod 1276 一个标签是并查集但跟并查集没有关系的3级题

(1)a,b排序的原因是比较快. (2)visit每次枚举询问不需要初始化的原因:b是升序排列的,枚举到b(i)时前面已经被淹没的岛屿仍然被淹没. (3)ans=1的原因是在b=0是仅存在一个大岛屿. (4)整个问题存在四种情况 1)第一个岛屿被淹没,这时如果第2个岛屿早已经被淹没了,就说明第一个岛屿被淹没以前是孤立存在的,现在被淹没了,那么ans当然要--: 2) 最后一个岛屿被淹没,这时如果第n-1个岛屿早已经被淹没了,同2). 3) 中间的一个岛屿被淹没了,如果前一个岛屿和后一个岛屿早已经

51nod 1196 字符串的数量

用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以接任意字符. (2) 对于编号为i的字符,如果2 * i <= n,则该字符不可以作为结尾字符.作为中间字符,那么后面接的字符编号一定要 >= 2 * i. 问有多少长度为M且符合条件的字符串,由于数据很大,只需要输出该数Mod 10^9 + 7的结果. 例如:N = 2,M = 3.则abb,