P11503 [NordicOI 2018] Nordic Camping

news/2025/1/6 4:58:56/文章来源:https://www.cnblogs.com/ccxswl/p/18651385

P11503 [NordicOI 2018] Nordic Camping

花了我挺长时间。

帐篷都是正方形的,可以枚举左上角,二分正方形边长,二维前缀和判断是否合法。这部分复杂度为 \(O(n^2\log n)\)。处理出来后,问题似乎就变成了矩形取最大值,单点查询。直接做是 \(\log^2\) 的,65 pts。具体就是,先扫描线(扫描线竖向),我们类似标记永久化,但修改的标记我们记录到线段树中每个节点中(可以随便用 STL 维护,例如 set、优先队列懒惰删除),撤销的时候暴力删除。

然后就考虑需要发现一点性质,我们所谓的“矩形取最大值,单点查询”,矩形全是正方形,值是正方形的面积。

我们依旧扫描线。考虑上面几种情况,蓝色正方形没有任何影响不用考虑。橙色正方形和黑色正方形重叠的部分,答案肯定是黑色,这时候橙色正方形对后面就没有任何影响了。粉色正方形影响的范围比黑色远,它还是可能有用的。这其实就是单调队列的过程,把上面的 STL 替换为单调队列,复杂度被优化为 \(O(n^2\log n)\)

#include <bits/stdc++.h>using namespace std;#define IL inline
#define fi first
#define se second
using pii = pair<int, int>;
using ubt = long long;IL void ckx(int &x, const int &y) { (x < y) && (x = y); }const int N = 2000, M = 1e5;
const int maxN = N + 3, maxM = M + 3;#define ls (p << 1)
#define rs (p << 1 | 1)
int NOW;
deque<pii> t[maxN << 2];
void C(int L, int R, int T, int v, int p, int l, int r) {if (L <= l && r <= R) {if (!t[p].empty() && t[p].back().se >= T) return; // 蓝色无用while (!t[p].empty() && t[p].back().fi <= v) t[p].pop_back();t[p].emplace_back(v, T);return;}int mid = (l + r) >> 1;if (L <= mid) C(L, R, T, v, ls, l, mid);if (R > mid) C(L, R, T, v, rs, mid + 1, r);
}
void ask(int K, int p, int l, int r, int &ans) {while (!t[p].empty() && t[p].front().se < NOW) t[p].pop_front();if (!t[p].empty()) ckx(ans, t[p].front().fi);if (l == r) return;int mid = (l + r) >> 1;if (K <= mid) ask(K, ls, l, mid, ans);else ask(K, rs, mid + 1, r, ans);
}int n, m;
char c[maxN][maxN];
int s[maxN][maxN];
IL int get(int x, int y, int a, int b) {return s[a][b] - s[a][y - 1] - s[x - 1][b] + s[x - 1][y - 1];
}int tot;
struct Modi {int y, l, r, v, T;
} mo[N * N + 3];int Q;
struct ques {int x, y, id;
} q[maxM];
int ans[maxM];int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j) {do c[i][j] = getchar(); while (c[i][j] != '.' && c[i][j] != '#');s[i][j] = c[i][j] == '#';}for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];for (int x = 1; x <= n; ++x)for (int y = 1; y <= m; ++y) if (c[x][y] != '#') {int l = 1, r = min(n - x + 1, m - y + 1);while (l <= r) {int mid = (l + r) >> 1;if (!get(x, y, x + mid - 1, y + mid - 1))l = mid + 1;else r = mid - 1;}mo[++tot] = {y, x, x + r - 1, r, y + r - 1};}sort(mo + 1, mo + tot + 1, [](const auto &A, const auto &B) {return A.y < B.y;});scanf("%d", &Q);for (int i = 1; i <= Q; ++i)scanf("%d %d", &q[i].x, &q[i].y), q[i].id = i;sort(q + 1, q + Q + 1, [](const auto &A, const auto &B) {return A.y < B.y;});int now = 1;for (int i = 1; i <= Q; ++i) {NOW = q[i].y;while (now <= tot && mo[now].y <= q[i].y) {C(mo[now].l, mo[now].r, mo[now].T, mo[now].v, 1, 1, n);now++;}ask(q[i].x, 1, 1, n, ans[q[i].id]);}for (int i = 1; i <= Q; ++i)printf("%d\n", ans[i] * ans[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863719.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenXR间接链接、API层总体排序、加载器设计

OpenXR间接链接 通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发…

OpenXR™加载器-设计、操作、调用链

OpenXR™加载器-设计和操作 1.2.1概述 OpenXR是一个分层体系结构,由以下元素组成: 1)OpenXR应用程序 2)OpenXR加载程序 3)OpenXR API层 4)OpenXR运行时间 一般概念适用于Windows和Linux的系统的加载程序。 首先,让把OpenXR环境看作一个整体。OpenXR应用程序位于执行链的…

经典专著《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》4本书推荐

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

使用format_obproxy_digest_log工具分析obproxy网络层耗时SQL

之前写过一个博客,介绍 ob_tools包 来实施抓取 observer 层的 gv$ob_sql_audit 的SQL,还提供一些分析SQL来通过不同维度分析缓慢的业务SQL语句,免得和应用扯皮说数据库执行SQL慢。 但是分析出服务端业务SQL语句执行时间还不够,应用也有可能会和你扯皮说obproxy转发慢,也不…

win 安装Android子系统WSA

win 安装Android子系统WSA 仅适用于Windows10和11。 在WSA中,对于要运行的应用不能保证较好的Android兼容性。 1.启用虚拟机平台功能 启用虚拟机平台: PS C:\Users\xxx> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启计…

Windows环境配置Nginx服务实现负载均衡

系统环境:win10 测试服务:.net6.0+webapi 一、本地创建一个webapi项目二、新建一个api控制器,里面编写一个测试方法三、我直接把这一个项目复制了3份,然后修改控制器方法中的返回值分别为value01,value02,value03四、分别启动三个程序,并且配置不同的端口号Postman/Apif…

二维数组的使用

1.二位数组的理解 Java 语言里提供了支持多维数组的语法 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel中的表格一样。 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层…

https申请+部署

1.申请参考:https://developer.aliyun.com/article/1635083 自动就行。 2.成功后会下载到两个文件。一个.poe 一个.key 部署 1.在/etc/nginx/conf.d里面新建一个文件夹cert,然后把这两个文件放进去。2.返回到nginx.conf里面配置, 这是原来的 server{listen 80;serve…

使用 SK Plugin 给 LLM 添加能力

前几篇我们介绍了如何使用 SK + ollama 跟 LLM 进行基本的对话。如果只是对话的话其实不用什么 SK 也是可以的。今天让我们给 LLM 整点活,让它真的给我们干点啥。 What is Plugin?Plugins are a key component of Semantic Kernel. If you have already used plugins from Ch…

FreeNAS 11.2-U6 简易上手指南

NAS是一个网络附属存储管理器,简单的可以理解为一个可以将数据存储至网络设备的服务。 NAS一般都会支持数据冗余、日志、压缩以及校验等功能。 国内最出名的应该就是群晖的系统了,当然我们这里主要讲解的是FreeNAS。 FreeNAS是一个基于FreeBSD进行二次开发的开源NAS系统,其支…

WhyNotWin11(win11检测工具)

微软官方Windows11检测工具写的太烂,第三方作者开发了一个,软件给每一项都标注了功能,通过了显示绿色,没通过显示红色。Windows目前不支持6、7代处理器。另外,主板不支持加密TPM2.0加密的也不行,不过这个TPM加密,估计后面会妥协,哦不,所有的都会妥协。获取地址:https…