USACO24DEC 2D Conveyer Belt S [ 蓝 ] [ 图论建模 ] [ Flood Fill ]
2D Conveyer Belt:图论建模+洪水填充妙妙题。质量极高。
观察
首先面对这种不断往图里面加点或者边,且满足前面的答案可以由加边后推出的题,第一个想到的就得是倒序枚举加边过程的 trick。一个经典的例子就是并查集倒序枚举操作。
然后我们观察,什么形态的图才会导致陷入一个死循环中。显然,要一堆方格围起来形成一个封闭的区域。
那么我们判断一个点会不会陷入死循环的方式就出来了:
- 若这个点还未确定方向,则与它四联通的点中只要有一个可以不陷入死循环,他就可以不陷入死循环。
- 若这个点方向已确定,则只有它要去的点可以不陷入死循环,他才能不陷入死循环。
于是,当一个图形态确定时,我们可以通过泛洪算法来求出哪些点可以不陷入死循环中。实现上,我们从四个边界外出发,然后向内依次拓展,对于一个待拓展的点判断能否找到一个可以不让他陷入死循环的点,转移一下即可。
时间复杂度 \(O(n^2)\)。
去除限制
接下来就是要考虑如何倒序枚举加边过程,即不断将图中本来确定方向的点换成问号。
显然,确定方向是一个比问号更强的限制。一旦去掉这个限制,陷入死循环的点一定不会增加。
同时,如果一个点本来就不会陷入死循环,那么我们就没有必要进行这次改成问号的操作了。因为这样一定最优了。
那么如果这个点本来会陷入死循环呢?我们依然可以按上述判断方法判断这个点能否不陷入死循环。若可以不陷入,那么就把这个点 Flood Fill 一下,枚举与它四联通的点进行拓展即可。
由于每个点不会被拓展后又变回去,所以每个点最多被拓展一次。那么均摊下来,整题时间复杂度就是 \(O(n^2)\) 的了。
代码
实现上,我们可以在 dfs 内部判断是否已被填充,是的话就不拓展了。然后在一个点新拓展的时候遍历与它四联通的点,在待拓展点的递归内部判断能否填充。
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,q,a[1005][1005],now=0;
int gox[]={0,0,1,-1};
int goy[]={1,-1,0,0};
int goc[]={2,1,4,3};
struct qry{
int x,y,tp,ans;
}b[200005];
bitset<1005>vis[1005];
bool legal(int x,int y)
{
return (x>=1&&x<=n&&y>=1&&y<=n);
}
void dfs(int x,int y)
{
if(vis[x][y])return;
bool flag=0;
if(a[x][y])
{
int tx=x+gox[goc[a[x][y]-1]-1],ty=y+goy[goc[a[x][y]-1]-1];
if(vis[tx][ty])flag=1;
}
else
{
for(int i=0;i<4;i++)
{
int tx=x+gox[i],ty=y+goy[i];
if(vis[tx][ty])flag=1;
}
}
if(!flag)return;
now++;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int tx=x+gox[i],ty=y+goy[i];
if(legal(tx,ty))dfs(tx,ty);
}
}
void init()
{
now=0;
for(int i=1;i<=n;i++)
{
vis[i][0]=1;
vis[0][i]=1;
vis[i][n+1]=1;
vis[n+1][i]=1;
}
for(int i=1;i<=n;i++)
{
dfs(i,1);
dfs(i,n);
dfs(1,i);
dfs(n,i);
}
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=q;i++)
{
int x,y,tp;
char c;
cin>>x>>y>>c;
if(c=='L')tp=1;
else if(c=='R')tp=2;
else if(c=='U')tp=3;
else tp=4;
b[i]={x,y,tp,0};
a[x][y]=tp;
}
init();
for(int i=q;i>=2;i--)
{
b[i].ans=now;
a[b[i].x][b[i].y]=0;
dfs(b[i].x,b[i].y);
}
b[1].ans=now;
for(int i=1;i<=q;i++)cout<<n*n-b[i].ans<<'\n';
return 0;
}
USACO24DEC 2D Conveyer Belt S [ 蓝 ] [ 图论建模 ] [ Flood Fill ]的更多相关文章
- 【题解】284E. Coin Troubles(dp+图论建模)
[题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- 玩转算法系列--图论精讲 面试升职必备(Java版)
第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...
- BZOJ2144 跳跳棋[建模+LCA]
思维题,思路比较神仙. 个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢.所以应该要么先向内跳一会,要么直接开始中间的向外跳.不知道怎么处理,就卡住了. 20pts: ...
- 【题解】Vijos1404 遭遇战(最短路图论套路)
[题解]Vijos1404 遭遇战(最短路图论套路) 感觉一定要有建模的思想,不管什么东西要抽象建模之后再用算法解决... 求最短代价就可能可以用最短路,这句话不是强行解释,而是因为图论建模过后,可能 ...
- 单图像三维重建、2D到3D风格迁移和3D DeepDream
作者:Longway Date:2020-04-25 来源:单图像三维重建.2D到3D风格迁移和3D DeepDream 项目网址:http://hiroharu-kato.com/projects_ ...
- poj1062
经典的图论建模题: 先拿开的等级问题不看: 每个物品本身的价格就是有一个自定义源点到这个点距离: 有了A物品B物品优惠为W就代表由B到A的有向路权值为W: 最后的最小花费就是源点的点1的最短路径(酋长 ...
- NOIP 提高组必会!(转)
1.排序算法(快排.选择.冒泡.堆排序.二叉排序树.桶排序)2.DFS/BFS 也就是搜索算法,剪枝务必要学! 学宽搜的时候学一下哈希表!3.树 ①遍历 ②二叉树 ③二叉排序树(查找.生成.删除) ④ ...
- HBSX2019 3月训练
Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指 ...
随机推荐
- Vue.js slot插槽
1.插槽的基本用法 组件的插槽允许用户将其他组件或者html片段插入到组件当中 // App.vue <template> <div id="app"> & ...
- oracle客户端安装先决条件检查出现PRVF-7531错误
场景:在局域网内,远程一台客户机进行客户端安装 度娘后,说一般情况下,由于操作系统未开启默认共享,导致Oracle无法检查环境的可用性. 查看server服务正常开启. 通过net share将c进行 ...
- 浅谈右值引用 移动语义 完美转发 std::move std::forward,窥探模板元编程的一角
右值引用 移动语义 完美转发具体是什么,就不说了,网上一搜一大堆,主要介绍下std::move和std::forward std::move std::forward 查下源码,gcc版本:gcc v ...
- Java模拟Oracle函数MONTHS_BETWEEN注意事项
Java模拟Oracle函数MONTHS_BETWEEN注意事项 MONTHS_BETWEEN(DATE1, DATE2) 用来计算两个日期的月份差. 最近接到一个迁移需求,把Oracle SQL接口 ...
- CCF中国开源大会,中电金信与行业共探AI技术在金融行业的应用和前景
10月21日,以"开源联合,聚力共赢"为主题的2023 CCF中国开源大会在长沙开幕.中电金信副总经理.研究院院长况文川参加峰会,在"算力与大模型"主题论坛 ...
- SAGA/TCC 就是 WORKFLOW!!!
SAGA TCC 的本质就是一个 workflow, 用 activiti, conductor 或 zeebee 都可以实现. saga, tcc 依赖的状态机模型在 workflow 引擎一直在用 ...
- 【Vue】Vue脚手架安装搭建
## Vue脚手架安装搭建 操作系统:Windows 11 专业工作站 记录时间:2022年2月18日 在安装之前,需要安装node.js(Node.js (nodejs.org)),否则无法使用np ...
- 如何使用Jet家软件进行学习(intellij、idea、IDEA、Pycharm……)
如何使用Jet家软件进行学习 本文档提供方法只用于学习研究,不得用于其他用途 以下,萌狼蓝天将会提供两种方式 目录 如何使用Jet家软件进行学习 第一种方式:使用EAP版本 第二种方式:使用插件 (1 ...
- [Symfony\Component\Process\Exception\RuntimeException] The Process class relies on proc_open, which is not available on your PHP installation.
[Symfony\Component\Process\Exception\RuntimeException] The Process class relies on proc_open, which ...
- Qt音视频开发06-海康sdk内核linux客户端
一.前言 海康sdk的示例在官方是提供了的,但是无论UI还是交互简直是宇宙无敌的垃圾,猜测应该是初学者编写的,估计练手用的,所以老早就想把这个linux支持集成到自己的示例中,既然已经支持了windo ...