[loj2461]完美的队列

题目大意

有n个队列,每个队列有一个上限ai
当队列上限满时,如果还要push,其会先执行一次pop。
现在有m个操作。
每次操作都会给一个区间的队列push同一个x。
要求回答每次操作后所有队列中数的种类数。

做法

当一个数 x 进入第i

# P3456 [POI 2007] GRZ-Ridges and Valleys ## 题目描述 **译自 POI 2007 Stage 2. Day 0「[Ridges and Valleys](https://szkopul.edu.pl/problemset/problem/rd6H05Dm8ME79sO3U9_f_ga_/site/?key=statement)」** 给定一个 $n \times n$ 的网格状地图,每个方格 $(i,j)$ 有一个高度 $w_{ij}$。如果两个方格有公共顶点,则它们是相邻的。 定义山峰和山谷如下: * 均由地图上的一个连通块组成; * 所有方格高度都相同; * 周围的方格(即不属于山峰或山谷但与山峰或山谷相邻的格子)高度均大于山谷的高度,或小于山峰的高度。 求地图内山峰和山谷的数量。特别地,如果整个地图方格的高度均相同,则整个地图既是一个山谷,也是一个山峰。 ## 输入格式 第一行一个整数 $n$ ($2 \le n \le 1000$),表示地图的大小。 接下来 $n$ 行每行 $n$ 个整数表示地图。第 $i$ 行有 $n$ 个整数 $w_{i1}, w_{i2}, \ldots, w_{in} (0 \le w_{ij} \le 1\ 000\ 000\ 000)$,表示地图第 $i$ 行格子的高度。 ## 输出格式 输出一行两个整数,分别表示山峰和山谷的数量。 ### 样例解释 ![](https://cdn.luogu.com.cn/upload/image_hosting/yubj6du3.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/7ct18655.png) 翻译来自于 [LibreOJ](https://loj.ac/p/2653)。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 8 8 8 7 7 7 7 8 8 7 7 7 7 7 7 7 8 8 7 8 7 8 8 8 8 ``` ### 输出 #1 ``` 2 1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 5 5 7 8 3 1 5 5 7 6 6 6 6 6 2 8 5 7 2 5 8 7 1 0 1 7 ``` ### 输出 #2 ``` 3 3 ```# P3456 [POI 2007] GRZ-Ridges and Valleys ## 题目描述 **译自 POI 2007 Stage 2. Day 0「[Ridges and Valleys](https://szkopul.edu.pl/problemset/problem/rd6H05Dm8ME79sO3U9_f_ga_/site/?key=statement)」** 给定一个 $n \times n$ 的网格状地图,每个方格 $(i,j)$ 有一个高度 $w_{ij}$。如果两个方格有公共顶点,则它们是相邻的。 定义山峰和山谷如下: * 均由地图上的一个连通块组成; * 所有方格高度都相同; * 周围的方格(即不属于山峰或山谷但与山峰或山谷相邻的格子)高度均大于山谷的高度,或小于山峰的高度。 求地图内山峰和山谷的数量。特别地,如果整个地图方格的高度均相同,则整个地图既是一个山谷,也是一个山峰。 ## 输入格式 第一行一个整数 $n$ ($2 \le n \le 1000$),表示地图的大小。 接下来 $n$ 行每行 $n$ 个整数表示地图。第 $i$ 行有 $n$ 个整数 $w_{i1}, w_{i2}, \ldots, w_{in} (0 \le w_{ij} \le 1\ 000\ 000\ 000)$,表示地图第 $i$ 行格子的高度。 ## 输出格式 输出一行两个整数,分别表示山峰和山谷的数量。 ### 样例解释 ![](https://cdn.luogu.com.cn/upload/image_hosting/yubj6du3.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/7ct18655.png) 翻译来自于 [LibreOJ](https://loj.ac/p/2653)。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 8 8 8 7 7 7 7 8 8 7 7 7 7 7 7 7 8 8 7 8 7 8 8 8 8 ``` ### 输出 #1 ``` 2 1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 5 5 7 8 3 1 5 5 7 6 6 6 6 6 2 8 5 7 2 5 8 7 1 0 1 7 ``` ### 输出 #2 ``` 3 3 ```# P3456 [POI 2007] GRZ-Ridges and Valleys ## 题目描述 **译自 POI 2007 Stage 2. Day 0「[Ridges and Valleys](https://szkopul.edu.pl/problemset/problem/rd6H05Dm8ME79sO3U9_f_ga_/site/?key=statement)」** 给定一个 $n \times n$ 的网格状地图,每个方格 $(i,j)$ 有一个高度 $w_{ij}$。如果两个方格有公共顶点,则它们是相邻的。 定义山峰和山谷如下: * 均由地图上的一个连通块组成; * 所有方格高度都相同; * 周围的方格(即不属于山峰或山谷但与山峰或山谷相邻的格子)高度均大于山谷的高度,或小于山峰的高度。 求地图内山峰和山谷的数量。特别地,如果整个地图方格的高度均相同,则整个地图既是一个山谷,也是一个山峰。 ## 输入格式 第一行一个整数 $n$ ($2 \le n \le 1000$),表示地图的大小。 接下来 $n$ 行每行 $n$ 个整数表示地图。第 $i$ 行有 $n$ 个整数 $w_{i1}, w_{i2}, \ldots, w_{in} (0 \le w_{ij} \le 1\ 000\ 000\ 000)$,表示地图第 $i$ 行格子的高度。 ## 输出格式 输出一行两个整数,分别表示山峰和山谷的数量。 ### 样例解释 ![](https://cdn.luogu.com.cn/upload/image_hosting/yubj6du3.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/7ct18655.png) 翻译来自于 [LibreOJ](https://loj.ac/p/2653)。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 8 8 8 7 7 7 7 8 8 7 7 7 7 7 7 7 8 8 7 8 7 8 8 8 8 ``` ### 输出 #1 ``` 2 1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 5 5 7 8 3 1 5 5 7 6 6 6 6 6 2 8 5 7 2 5 8 7 1 0 1 7 ``` ### 输出 #2 ``` 3 3 ```
最新发布
08-27
### 问题解析 该问题要求计算一个二维地图中“山脊”(Ridges)和“山谷”(Valleys)的数量。具体来说,山脊是指一个连通区域,其值高于所有相邻区域,而山谷是指一个连通区域,其值低于所有相邻区域。地图由一个 $ N \times N $ 的矩阵表示,其中每个单元格的值代表该点的高度。 ### 解题思路 该问题可以通过 **广度优先搜索(BFS)** 或 **深度优先搜索(DFS)** 来解决。核心思想是: 1. 遍历整个地图,对每一个未访问的点进行 BFS/DFS。 2. 在遍历过程中,判断当前区域是否为山脊或山谷。 3. 判断依据是:该区域的值是否大于或小于所有相邻点的值。若等于相邻点的值,则属于同一区域。 ### 数据结构与算法 - 使用一个二维数组 `grid` 存储地图信息。 - 使用一个二维布尔数组 `visited` 记录每个点是否已被访问。 - 使用 BFS 遍历每个连通区域,并在遍历过程中判断该区域是否是山脊或山谷。 ### 示例代码(C++) ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = 1005; int grid[MAXN][MAXN]; bool visited[MAXN][MAXN]; int N; // 方向数组:上下左右 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; // 判断是否越界 bool inBounds(int x, int y) { return x >= 0 && x < N && y >= 0 && y < N; } // BFS 遍历连通区域并判断是否为山脊或山谷 pair<bool, bool> bfs(int sx, int sy) { queue<pair<int, int>> q; q.push({sx, sy}); visited[sx][sy] = true; bool isRidge = true, isValley = true; int currentVal = grid[sx][sy]; while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (inBounds(nx, ny)) { if (grid[nx][ny] > currentVal) { isRidge = false; } else if (grid[nx][ny] < currentVal) { isValley = false; } else { if (!visited[nx][ny]) { visited[nx][ny] = true; q.push({nx, ny}); } } } } } return {isRidge, isValley}; } int main() { cin >> N; for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) cin >> grid[i][j]; int ridges = 0, valleys = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (!visited[i][j]) { pair<bool, bool> result = bfs(i, j); if (result.first) ridges++; if (result.second) valleys++; } } } cout << ridges << " " << valleys << endl; return 0; } ``` ### 时间复杂度分析 - 每个点只会被访问一次,因此总时间复杂度为 $ O(N^2) $,其中 $ N $ 是地图的边长。 - 空间复杂度主要由 `visited` 数组和队列控制,约为 $ O(N^2) $。 ### 测试样例 输入样例: ``` 5 8 8 8 7 7 7 7 7 7 8 8 7 7 7 7 7 7 7 8 8 8 8 7 8 8 ``` 输出样例: ``` 2 1 ``` ### 优化建议 - 可以使用 **DFS** 替代 **BFS**,但逻辑上类似。 - 如果地图较大,可以考虑使用 **并查集(Union-Find)** 进行预处理,将相同高度的连通区域合并。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值