当前位置:网站首页>【luogu CF1534F2】Falling Sand (Hard Version)(性质)(dfs)(线段树 / 单调队列 / 贪心)
【luogu CF1534F2】Falling Sand (Hard Version)(性质)(dfs)(线段树 / 单调队列 / 贪心)
2022-08-10 19:01:00 【SSL_TJH】
Falling Sand (Hard Version)
题目链接:luogu CF1534F2
题目大意
给你一个网格,每个位置可能有沙子。
如果你操作了一个沙子,它会下落,并且操作它下落过程中上下左右相邻的沙子。
然后问你最少要自己操作多少个沙子才会使得所有沙子都被操作。
思路
首先一些贪心,就是肯定是点一列的最上面,然后能影响的肯定是一个区间。(就算中间隔开了你点中间还是会影响被隔开的,所以可以算不影响)
(然后被影响的也是一个区间)
考虑模拟这个过程,那就是如果一个沙子会影响到另一个沙子,就连边。
然后你就可以通过 dfs,得到一个沙子被操作的区间。
(找左边界就从左到右搜索,否则从右到左搜索得到右边界)
然后剩下就是一个区间覆盖问题,随便用啥都行。
代码
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f3f3f3f3f
#define bh(x, y) (((x) - 1) * n + (y))
using namespace std;
const int N = 4e5 + 100;
int n, m, L[N], R[N], nd[N], Rs[N], sta[N], f[N];
char c;
vector <int> a[N], up[N];
struct node {
int to, nxt;
}e[N << 3];
int le[N], KK;
bool in[N];
void add(int x, int y) {
e[++KK] = (node){
y, le[x]}; le[x] = KK;}
void dfsl(int now, int col) {
L[now] = col; in[now] = 1;
for (int i = le[now]; i; i = e[i].nxt) if (!in[e[i].to]) dfsl(e[i].to, col);
}
void dfsr(int now, int col) {
R[now] = col; in[now] = 1;
for (int i = le[now]; i; i = e[i].nxt) if (!in[e[i].to]) dfsr(e[i].to, col);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
c = getchar(); while (c != '#' && c != '.') c = getchar();
if (c == '#') a[j].push_back(n - i + 1);
}
for (int i = 1; i <= m; i++) reverse(a[i].begin(), a[i].end());
for (int i = 1; i <= m; i++) scanf("%d", &nd[i]);
for (int i = 1; i <= m; i++) {
if (!a[i].size()) continue;
for (int j = 1; j < a[i].size(); j++) {
add(bh(i, a[i][j]), bh(i, a[i][j - 1]));
if (a[i][j - 1] + 1 == a[i][j]) add(bh(i, a[i][j - 1]), bh(i, a[i][j]));
}
for (int op = 1; op >= -1; op--) {
if (op == 0) continue;
if (!a[i + op].size()) continue;
int now = a[i + op].size() - 1; while (now >= 0 && a[i + op][now] > a[i][a[i].size() - 1]) now--;
int nowx = a[i].size() - 1;
for (int j = a[i][a[i].size() - 1]; j >= 1; j--) {
if (nowx > 0 && a[i][nowx - 1] == j) nowx--;
if (now >= 0 && a[i + op][now] == j) add(bh(i, a[i][nowx]), bh(i + op, a[i + op][now])), now--;
}
}
}
for (int i = 1; i <= m; i++)
if (a[i].size() && !in[bh(i, a[i][a[i].size() - 1])])
dfsl(bh(i, a[i][a[i].size() - 1]), i);
memset(in, 0, sizeof(in));
for (int i = m; i >= 1; i--)
if (a[i].size() && !in[bh(i, a[i][a[i].size() - 1])])
dfsr(bh(i, a[i][a[i].size() - 1]), i);
for (int i = 1; i <= m; i++)
for (int j = 0; j < nd[i]; j++)
Rs[R[bh(i, a[i][j])]] = max(Rs[R[bh(i, a[i][j])]], L[bh(i, a[i][j])]);
int l = 1, r = 1;
for (int i = 1; i <= m; i++) {
f[i] = f[sta[l]] + 1;
while (l <= r && f[sta[r]] >= f[i]) r--;
sta[++r] = i;
while (l <= r && sta[l] < Rs[i]) l++;
}
printf("%d", f[sta[l]]);
return 0;
}
边栏推荐
- 陕西CAS:1244028-50-9_Biotin-PEG3-SCO-PPh3 固体
- MySQL安装步骤
- Today's bug, click on the bug that the Windows dynamic wallpaper disappears in the win10 taskbar, and no solution has been found yet.
- 1720. 解码异或后的数组
- QoS服务质量六路由器拥塞管理
- 剑指 Offer II 034. 外星语言是否排序-辅助数组法
- MySQL 原理与优化:Update 优化
- 搭建自己的以图搜图系统 (一):10 行代码搞定以图搜图
- [教你做小游戏] 斗地主的手牌,如何布局?看25万粉游戏区UP主怎么说
- MySql main performance indicators description
猜你喜欢
魔方电池如何“躺赢”?解锁荣威iMAX8 EV“头等舱”安全密码
入门:人脸专集2 | 人脸关键点检测汇总(文末有相关文章链接)
什么是企业知识库?有什么作用?如何搭建?
postgis空间数据导入及可视化
2022-08-09 Study Notes day32-IO Stream
从企业的视角来看,数据中台到底意味着什么?
选择是公有云还或是私有云,这很重要吗?
【无标题】基于Huffman和LZ77的GZIP压缩
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
剖析Framework面试—>>>冲击Android高级职位
随机推荐
小分子PEG CAS:1352814-07-3生物素-PEG6-丙酸叔丁酯
JVM基本结构
CEO对今天的CIO们真正的要求是什么?
QoS Quality of Service Seven Switch Congestion Management
瑞吉外卖学习笔记4
CAS:2055042-70-9_N-(叠氮基-PEG4)-生物素
799. 最长连续不重复(双指针)
【初学必备】3d游戏建模入门基础知识
【知识分享】在音视频开发领域中SEI到底是个啥?
状态压缩dp蒙德里安的梦想
Biotin-PEG4-IC(TFP ester/amine/NHS Ester/azide)特性分享
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
第四届“传智杯”全国大学生IT技能大赛(初赛A组) 补题
postgis空间数据导入及可视化
3D游戏建模学习路线
flask装饰器版登录、session
谈谈宝石方块游戏中的设计
Today's bug, click on the bug that the Windows dynamic wallpaper disappears in the win10 taskbar, and no solution has been found yet.
罗克韦尔Rockwell Automation EDI 项目
NPDP|传统行业产品经理如何进行能力提升?