P11454 [USACO24DEC] 2D Conveyer Belt S

题目大意

详细题目传送门
一个 \(n\cdot n\) 的网格 \(a\)。每个网格有传送带。其中 L,R,U,D 就分别代表把传送带上的物体移动到左右上下方向的格子。如果送出了边界就代表送出去了。然后还有 ? 是代表还没有在这个网格上建传送带。

\(Q\) 次操作,每一次 将 \(a_{x,y}\) 从原先的 ? 改成四种方向中的一个传送带。求每一次操作后,假设 将其它的 ? 改成某个方向的传送带,则从每一个 \(a_{x,y}\) 开始运输,有多少个格子开始不能运输到网格外。

\(n\leq1000,Q\leq 2\cdot 10^5\)

思路

对于有一个 \(O(Qn^2)\) 的部分分是平凡的。可以发现如果从每个格子开始枚举就不现实。所以考虑将所有传送带都“反过来”,即求出从网格外开始向内做宽搜有多少个格子访问不到。对于 ? 就可以认为可以从任何地方到达。之后记录不能访问的格子数再用 \(n^2\) 减去即可。这里有暴力代码。

其实正解也差不多了。可以考虑离线。然后将整个询问反过来处理。相当于再一次正难则反。对于第一次询问(以下次数均指翻转后),直接跑一次上方暴力即可得到答案。然后对于每一次操作,相当于将原先的 \(a_{x,y}\) 从一个四向传送带改成 ?。如果已经被访问过了答案不变,直接复制上一个询问的答案。

对于没有访问过的格子,直接考虑这个格子能否被周边已访问格子访问到。如果可以就再从 \(a_{x,y}\) 开始做暴力即可。但是因为每一个格子只会被访问一次,所以时间复杂度是 \(O(Q+n^2)\) 的。

对于正确性,即如果一个格子在上一个操作可以被访问到,在下一个操作会不会被撤销访问。发现不会,因为每一次改成的 '?' 一定会更好,这是因为对于四向和反向边,显然只有一个唯一匹配的更新操作。而对于 '?' 就充满了不确定性了。但是因为只要有一种确定路径让它出去就可以,所以相当于所有的四向格子和不确定格子只要能访问到它就一定可以直接去遍历。既继承了原先的边关系也新增了几条边,所以答案一定不会变少,每一个格子只要在之前访问过就一定会一直存在。

代码

// Problem: P11454 [USACO24DEC] 2D Conveyer Belt S
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P11454
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
typedef long long ll;
const ll MAXN=1e3+5;
ll n,Q;
ll dx[]={0,0,1,-1},dy[]={1,-1,0,0};
char C[MAXN][MAXN];
vector<pair<ll,ll>>adj;
bool vis[MAXN][MAXN];
ll dui[200][2];
ll bfs(){ll ans=0;queue<pair<ll,ll>>q;for(auto v:adj){q.push(v);//vis[v.first][v.second]=true;}while(!q.empty()){ll x=q.front().first,y=q.front().second;q.pop();if(vis[x][y]){continue;}vis[x][y]=true;//cout<<x<<" "<<y<<endl;ans++;for(int i=0;i<4;++i){ll X=x+dx[i],Y=y+dy[i];if(X<1||X>n||Y<1||Y>n||vis[X][Y]){continue;}if(C[X][Y]!='?'){if((i==0&&C[X][Y]!='L')||(i==1&&C[X][Y]!='R')||(i==2&&C[X][Y]!='U')||(i==3&&C[X][Y]!='D')){continue;}}q.push({X,Y});}}return ans;
}
struct Query{ll x,y;char op;
}q[200005];
void addf(){adj.clear();if(C[1][1]=='L'||C[1][1]=='U'||C[1][1]=='?'){adj.push_back({1,1});}for(int i=2;i<n;++i){if(C[1][i]=='?'||C[1][i]=='U'){adj.push_back({1,i});}}if(C[1][n]=='R'||C[1][n]=='U'||C[1][n]=='?'){adj.push_back({1,n});}for(int i=2;i<n;++i){if(C[i][n]=='?'||C[i][n]=='R'){adj.push_back({i,n});}}if(C[n][n]=='R'||C[n][n]=='D'||C[n][n]=='?'){adj.push_back({n,n});}for(int i=2;i<n;++i){if(C[n][i]=='?'||C[n][i]=='D'){adj.push_back({n,i});}}if(C[n][1]=='L'||C[n][1]=='D'||C[n][1]=='?'){adj.push_back({n,1});}for(int i=2;i<n;++i){if(C[i][1]=='?'||C[i][1]=='L'){adj.push_back({i,1});}}
}
ll Ans[MAXN];
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>Q;for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){C[i][j]='?';}}for(int i=1;i<=Q;++i){cin>>q[i].x>>q[i].y>>q[i].op;C[q[i].x][q[i].y]=q[i].op;}reverse(q+1,q+Q+1);addf();Ans[1]=bfs();for(int T=1;T<Q;++T){ll x=q[T].x,y=q[T].y;C[x][y]='?';if(vis[x][y]){Ans[T+1]=Ans[T];continue;}addf();//printc();for(int i=0;i<4;++i){ll X=x+dx[i],Y=y+dy[i];if(X<1||X>n||Y<1||Y>n||!vis[X][Y]){continue;}adj.push_back({x,y});break;}Ans[T+1]=Ans[T]+bfs();}for(int i=Q;i>=1;--i){cout<<n*n-Ans[i]<<endl;}return 0;
}

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

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

相关文章

在Windows 任务计划程序 中创建IIS保活任务

1,此电脑 右键管理,创建任务;2,触发器,重复任务间隔1小时,持续时间 无期限;3,操作,powershell.exe Invoke-WebRequest -Uri "http://localhost:8080"

“代码与成长:从迷茫到收获的一段旅程”

代码与成长:从迷茫到收获的一段旅程 目录迷茫的开始:我的软件工程初体验 学习与实践:从失败中收获力量个人编程:扎实基础 结对编程:倾听与合作 现场编程:与时间赛跑 团队项目:从混乱到有序初期遇到的挑战 面对挑战的调整与优化 项目的最终成果与反思技术与工具:助力成长…

昆明理工大学F003计算机核心课程综合复试参考书

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理

coderwhy_Vue3+TypeScript

【公开课】coderwhy_Vue3+TypeScript.mp4 Vue3+TypeScript 王红元 coderwhy ke.qq.com/course/3453141?tuin 1635c7de 《TypeScript数据结构与算法》《React技术栈权威指南》作者腾讯AI高校训练营多所985、211名牌大学特聘讲师。丰富的软件开发和教学经验,带领团队开发出众多…

E92 换根DP+倍增 P5666 [CSP-S2019] 树的重心

视频链接:E92 换根DP+倍增 P5666 [CSP-S2019] 树的重心_哔哩哔哩_bilibili P5666 [CSP-S2019] 树的重心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 换根DP+倍增 O(nlogn) #include <iostream> #include <cstring> #include <algorithm> #include …

Java中的微信支付(1):API V3版本签名详解

Java中的微信支付(1):API V3版本签名详解Java中的微信支付(1):API V3版本签名详解| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | …

AI泳池溺水监测识别摄像机

AI泳池溺水监测识别摄像机是一种利用人工智能和机器视觉技术的创新设备,旨在确保游泳池安全,并及时识别溺水事件,以减少溺水事故的发生。这种摄像机利用高清摄像头和AI算法,能够实时监测泳池中的情况,并自动识别溺水事件。它可以迅速发现水面上出现异常的情况,如有人体在…

数据恢复软件下载_R-Studio V9.4.191420中文绿色版下载

软件介绍 数据恢复软件R-Studio 绿色版是一款来自于加拿大的功能强大、经济高效的数据恢复软件,它将最先进的文件恢复和磁盘修复技术与直观的用户界面进行联合,可为企业和专业级数据恢复专家提供所需工具。不论是有经验的数据恢复专业人员,还是入门级用户都不会有使用方面的…

泥石流识别摄像头

泥石流识别摄像头的核心在于其深度学习算法,泥石流识别摄像头具备全天候监控的能力,无论是白天还是夜晚,都能稳定运行。当摄像头监测到山体出现落石、坍塌或泥石流等异常情况时,系统会立即启动报警机制。报警方式多样,包括发出声音警报、向用户的电脑或手机推送报警信息等…

从零开始搭建SpringBoot项目

一、创建SpringBoot项目二、上一步填写完信息后点击Next,进入选择依赖库界面,在这里大家就可以选择我们开发当中要使用到的如:数据库驱动,技术,框架等等。 (下面是大多项目中会使用到的技术,可以根据项目选择会用的插件)三、给IDEA安装插件:需要给IDEA安装的插件一共有…

中考阅读理解深入逻辑分析-007 Hooves of Justice: The Equine Guardians 正义之蹄:马匹守护者

中考阅读理解深入逻辑分析-007 Hooves of Justice: The Equine Guardians 正义之蹄:马匹守护者 文章正文 ​ Police officer Dennis was recently patrolling(巡逻)the streets of Newark, New Jersey. Suddenly, he found four men fighting. As he approached, one of…

灵感上线,云开发实现抽奖转盘是多么简单的一件事

今天,我们继续深入探讨云开发的应用。本次,我们将实现一个简单的小游戏——转盘抽奖。这一项目的灵感来源于腾讯云创作之星内部每周举办的创作活动和每月的抽奖环节。由于每次抽奖都需要使用小程序进行,而小程序的审核过程通常较为缓慢,因此我想借助云开发,看看能否快速实…