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];
14
15 bool cmp(node a, node b)
16 {
17     return a.val < b.val;
18 }
19
20 bool vis[MAXN];
21 int ans[MAXN];
22
23 int main()
24 {
25     int N, Q;
26     while(~scanf("%d%d",&N,&Q))
27     {
28         memset(vis, 0, sizeof(vis));    //没被淹没
29         for(int i=0; i<N; i++)
30         {
31             scanf("%d",&a[i].val);
32             a[i].pos = i;
33         }
34         for(int i=0; i<Q; i++)
35         {
36             scanf("%d",&q[i].val);
37             q[i].pos = i;
38         }
39         sort(a, a+N, cmp);
40         sort(q, q+Q, cmp);
41         int sum = 1, j = 0 ;
42         for(int i=0; i<Q; i++)
43         {
44             while(a[j].val <= q[i].val && j<N)
45             {
46                 //判断是不是第一个点
47                 if(a[j].pos == 0)
48                 {
49                     if(vis[1])      //被淹没
50                         sum--;
51                 }
52                 //判断是不是最后一个点
53                 else if(a[j].pos == N-1)
54                 {
55                     if(vis[N-2])
56                         sum--;
57                 }
58                 else
59                 {
60                     if(vis[a[j].pos-1] && vis[a[j].pos+1])//山峰
61                         sum--;
62                     else if(!vis[a[j].pos-1] && !vis[a[j].pos+1])//山谷
63                         sum++;
64                 }
65                 vis[a[j].pos] = 1;      //标记被淹没
66                 j++;
67             }
68             ans[q[i].pos] = sum;
69         }
70         for(int i=0; i<Q; i++)
71             printf("%d\n",ans[i]);
72     }
73     return 0;
74 }

原文地址:https://www.cnblogs.com/jaydenouyang/p/8996082.html

时间: 2024-10-06 08:37:50

51Nod 1006 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 1276 岛屿的数量(脑洞 + 思维)

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

[2016-05-09][51nod][1006 最长公共子序列Lcs]

时间:2016-05-09 21:12:54 星期一 题目编号:[2016-05-09][51nod][1006 最长公共子序列Lcs] 题目大意:[2016-05-09][51nod][1006 最长公共子序列Lcs].md 分析:动态规划 dp[i][j] 表示字符串A以第i个位置 ,字符串B以第j个位置的最长公共子序列的长度 dp[i][j] = dp[i - 1][j - 1] + 1 if a[i] == a[j] else dp[i][j] == max(dp[i - 1][j] ,

[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:

[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

CodeVS 1359 数字计数 51nod 1042 数字0-9的数量 Pascal

题目大意: 我的代码又臭又长,但是毕竟是我这个jr想了几天才推出的公式,看别的大神都写数位DP,所以我决定分享一下我的思路.我认为我的思路一向是最好理解的! 要分两种情况讨论: 1.0的情况.我们首先推出0~9中只有1个0,在0~99中有(1+(9*100*1))个0{第一位可以为1~9,第二位可以为0~9,0只可以放在后者,所以乘1},在0~999中有((1+(9*100*1))+(9*101*2))个0~6666为例,先算出0~999中0的个数,在算出1000~5999中0的个数,则为(10

51nod 1132 覆盖数字的数量 V2

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1132 题意是给定a,b,l,r求[l,r]内有几个整数可以表示成ax+by(x,y为非负整数). 直接算l<=ax+by<=r会重复计算一个数的多种表示方法,而两种表示方法(x,y)总是相差k*(b,-a),因此限制y取最小值进行去重 即x>=0,y>=0,l<=ax+by<=r,y<a/gcd(a,b)五个半平面的交的整点个数,可以分类