ABC370:Cross Explosion(数据结构,模拟)

news2024/9/25 2:27:18

题目

有一个网格,网格中有 HH 行和 WW 列。让 (i,j)(i,j) 表示从上往下第 ii 行和从左往上第 jj 列的单元格。
最初,每个单元格中都有一面墙。
按照下面给出的顺序处理 QQ 个查询后,求剩余墙的数量。

在 qq -th 查询中,我们给出了两个整数 RqRq​ 和 CqCq​ 。
你在 (Rq,Cq)(Rq​,Cq​) 处放置了一枚炸弹来摧毁墙壁。结果发生了以下过程。

  • 如果 (Rq,Cq)(Rq​,Cq​) 处有墙壁,则摧毁该墙壁并结束进程。
  • 如果{2227765}处没有墙壁,则摧毁从 (Rq,Cq)(Rq​,Cq​) 向上、向下、向左、向右观察时出现的第一面墙壁。更确切地说,以下四个过程是同时进行的:
    • 如果存在一个 i<Rqi<Rq​ ,在所有 i<k<Rqi<k<Rq​ 中, (i,Cq)(i,Cq​) 处有一堵墙,而 (k,Cq)(k,Cq​) 处没有墙,则摧毁 (i,Cq)(i,Cq​) 处的墙。
    • 如果存在一个 i>Rqi>Rq​ ,使得在 (i,Cq)(i,Cq​) 处有一堵墙,而在所有 Rq<k<iRq​<k<i 中,在 (k,Cq)(k,Cq​) 处没有墙,则破坏 (i,Cq)(i,Cq​) 处的墙。
    • 如果存在一个 j<Cqj<Cq​ ,使得在 (Rq,j)(Rq​,j) 处有一堵墙,而在 (Rq,k)(Rq​,k) 处没有墙,且所有的 j<k<Cqj<k<Cq​ 都是如此,则破坏 (Rq,j)(Rq​,j) 处的墙。
    • 如果存在一个 j>Cqj>Cq​ ,使得在 (Rq,j)(Rq​,j) 处有一堵墙,而在所有 Cq<k<jCq​<k<j 的 (Rq,k)(Rq​,k) 处都没有墙,则摧毁 (Rq,j)(Rq​,j) 处的墙。

限制因素

  • 1≤H,W1≤H,W
  • H×W≤4×105H×W≤4×105
  • 1≤Q≤2×1051≤Q≤2×105
  • 1≤Rq≤H1≤Rq​≤H
  • 1≤Cq≤W1≤Cq​≤W
  • 所有输入值均为整数

做法

行和列进行模拟。

这是我用vector写的,又臭又长,还超时了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
int n,m,q;
vector<int> h[N],l[N];
unordered_map<int,int> mp;
int ans;
signed main(){
	scanf("%lld%lld%lld",&n,&m,&q);
	ans=n*m;
	vector<vector<int> > a(n,vector<int>(m));
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			h[i].push_back(j);
			l[j].push_back(i);
		}
	}
	while(q--){
		int x,y;
		scanf("%lld%lld",&x,&y);
		x--,y--;
		if(!mp[x*m+y]) {//没销毁 
			ans--;
			mp[x*m+y]=1;
			int id1=lower_bound(l[y].begin(),l[y].end(),x)-l[y].begin();//删除行 
			int id2=lower_bound(h[x].begin(),h[x].end(),y)-h[x].begin();//删除列 
			l[y].erase(l[y].begin()+id1);
			h[x].erase(h[x].begin()+id2);
			continue;
		}
		
		int id1=upper_bound(l[y].begin(),l[y].end(),x)-l[y].begin();//删除行 
		if(id1>0&&id1<l[y].size()) {//上 
			mp[l[y][id1-1]*m+y]=1;
			int id=lower_bound(h[l[y][id1-1]].begin(),h[l[y][id1-1]].end(),y)-h[l[y][id1-1]].begin();
			h[l[y][id1-1]].erase(h[l[y][id1-1]].begin()+id); 
			l[y].erase(l[y].begin()+id1-1);
			ans--;
		}
		else if(l[y].size()>0&&id1==l[y].size()){
			int yy=l[y].size()-1;
			mp[l[y][yy]*m+y]=1;
			int id=lower_bound(h[l[y][yy]].begin(),h[l[y][yy]].end(),y)-h[l[y][yy]].begin();
			h[l[y][yy]].erase(h[l[y][yy]].begin()+id); 
			l[y].erase(l[y].begin()+yy);
			ans--;
		}
		
		
		id1=upper_bound(l[y].begin(),l[y].end(),x)-l[y].begin();//删除行 
		if(id1<n-1&&id1<l[y].size()){//下 
			mp[l[y][id1]*m+y]=1;
			int id=lower_bound(h[l[y][id1]].begin(),h[l[y][id1]].end(),y)-h[l[y][id1]].begin();
			h[l[y][id1]].erase(h[l[y][id1]].begin()+id); 
			l[y].erase(l[y].begin()+id1);
			ans--;
		}
		
		int id2=upper_bound(h[x].begin(),h[x].end(),y)-h[x].begin();//删除列 
		if(id2>0&&id2<h[x].size()){//左 
			mp[x*m+h[x][id2-1]]=1;
			int id=lower_bound(l[h[x][id2-1]].begin(),l[h[x][id2-1]].end(),x)-l[h[x][id2-1]].begin();
			l[h[x][id2-1]].erase(l[h[x][id2-1]].begin()+id);
			h[x].erase(h[x].begin()+id2-1);
			ans--;
		}
		else if(h[x].size()>0&&id2==h[x].size()){
			int yy=h[x].size()-1;
			mp[x*m+h[x][yy]]=1;
			int id=lower_bound(l[h[x][yy]].begin(),l[h[x][yy]].end(),x)-l[h[x][yy]].begin();
			l[h[x][yy]].erase(l[h[x][yy]].begin()+id);
			h[x].erase(h[x].begin()+yy);
			ans--;
		}
		
		id2=upper_bound(h[x].begin(),h[x].end(),y)-h[x].begin();
		if(id2<m-1&&id2<h[x].size()){//右 
			mp[x*m+h[x][id2]]=1;
			int id=lower_bound(l[h[x][id2]].begin(),l[h[x][id2]].end(),x)-l[h[x][id2]].begin();
			l[h[x][id2]].erase(l[h[x][id2]].begin()+id);
			h[x].erase(h[x].begin()+id2);
			ans--;
		}
		
	}
	cout<<ans; 
}

这是题解的做法,用set模拟,代码短多了,而且set的迭代器操作很方便。例如prev,还有set的删除操作erase可以直接删值,而不用下标。

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int n,m,q;
set<int> h[N],l[N];
int ans;
signed main(){
	scanf("%d%d%d",&n,&m,&q);
	ans=n*m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			h[i].insert(j);
			l[j].insert(i);
		}
	}
	
	while(q--){

		int x,y;
		scanf("%d%d",&x,&y);
		x--,y--;

		if(h[x].count(y)) {//没销毁 
			ans--;
			l[y].erase(x);
			h[x].erase(y);
			continue;
		}
		
		auto id=l[y].upper_bound(x);
		if(id!=l[y].begin()) {//上 
			ans--;
			h[*prev(id)].erase(y);
			l[y].erase(*prev(id));			
		}
	
		id=l[y].upper_bound(x);
		if(id!=end(l[y])){//下 
			ans--;
			h[*id].erase(y);
			l[y].erase(*id);
		}
		
		id=h[x].upper_bound(y);
		if(id!=begin(h[x])){//左 
			ans--;
			l[*prev(id)].erase(x);
			h[x].erase(*prev(id));
			
		}
		
		id=h[x].upper_bound(y);
		if(id!=end(h[x])){//右 
			ans--;
			l[*id].erase(x);
			h[x].erase(*id);
		}
		
	}

	cout<<ans; 
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux网络 —— 网络基础概念】

Linux网络 —— 网络基础概念 计算机网络背景网络发展 初始协议协议分层协议分层的好处 OSI七层模型TCP/IP五层(或四层)模型 再识协议为什么要有TCP/IP协议&#xff1f;什么是TCP/IP协议&#xff1f;TCP/IP协议与操作系统的关系所以究竟什么是协议&#xff1f; 网络传输基本流程…

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

Python画笔案例-059 绘制甩曲彩点动图

1、绘制甩曲彩点动图 通过 python 的turtle 库绘制 甩曲彩点动图,如下图: 2、实现代码 绘制甩曲彩点动图,以下为实现代码: """甩曲彩点动图.py """ import time import turtlecs = [red,orange,

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task

论文汇总 当前的问题 图1:在VTAB-1k基准测试上&#xff0c;使用预训练的ViT-B/16模型&#xff0c;VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示&#xff0c;当给出大量提示时&#xff0c;VPT显示了性能的显著下降…

串口问题汇总:串口发送乱码,重定义使用printf ,输出顺序出错,缓存区思想,串口项目应用

1.c51使用串口出现顺序被覆盖的情况&#xff0c;也就是输出time 最后输出的却是te 这是因为你没有等待上一个数据发送就开始发送下一个数据就会导致数据篡位 2.c51想使用串口重定义使用printf 首先c51是自带stdio.h不需要像32那样点击 include lib选项&#xff0c;你直接改…

力扣958:判断二叉树是否为完全二叉树

给你一棵二叉树的根节点 root &#xff0c;请你判断这棵树是否是一棵 完全二叉树 。 在一棵 完全二叉树 中&#xff0c;除了最后一层外&#xff0c;所有层都被完全填满&#xff0c;并且最后一层中的所有节点都尽可能靠左。最后一层&#xff08;第 h 层&#xff09;中可以包含 …

体制内打工人收藏!5款AI写作工具,助你变成单位笔杆子~

对于初入体制内职场的新手或是日常任务繁重、难以抽身撰写文件的同事们&#xff0c;别再让加班的夜晚成为常态&#xff01;现在&#xff0c;就让我揭秘几个高效公文写作宝库&#xff0c;它们能助你迅速掌握公文写作的精髓&#xff0c;海量素材信手拈来&#xff0c;更有快速成文…

Elasticsearch、ik分词器、elasticsearch-head、Kibana的认识与安装

文章目录 elasticsearch安装elasticsearchIK中文分词器elasticsearch-headkibana elasticsearch Elasticsearch是一个基于Lucene的搜索服务器&#xff0c;也是属于NoSQL阵营的数据库。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口提供给我们操…

2025年SEO策略:如何优化您的知识库?

如今很多人在遇到问题时都会求助于谷歌。谷歌已经成为提供解决方案不可或缺的工具。作为全球搜索引擎的巨头&#xff0c;拥有大量用户流量。这就是为什么确保您的产品和服务在谷歌搜索结果中排名靠前是至关重要的&#xff0c;如果您想获得更多的客户&#xff0c;SEO是一个非常关…

打造你的专属主题-VitePress保姆级教程

本篇为vitepress系列教程&#xff0c;在开始前&#xff0c;若还不了解vitepress的小伙伴可以看一下以往文章&#xff1a; 不敲一行代码&#xff01;助你快速搭建属于自己的官网博客&#xff01;-VitePress保姆级教程 文章目录 VitePress主题配置准备自定义主题配置标题配置图标…

如何用AI实现自动更新文章?(全自动更新网站)

AI的诞生确实给我们的生活和工作都带来了很大的改变&#xff0c;从我自身来讲&#xff0c;也渐渐习惯了遇到事情先问问AI&#xff0c;不管是翻译、专业性问题、PPT制作、总结写作这些&#xff0c;确实帮我迅速理清了思路&#xff0c;也可以有很多内容的借鉴。 作为一个业余爱好…

滑动窗口算法第一弹(长度最小的子数组,无重复字符的最长子串 最大连续1的个数III)

目录 前言 1. 长度最小的子数组 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;暴力解法 &#xff08;3&#xff09;优化 2. 无重复字符的最长子串 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;暴力解法 &#xff08;3&#xff…

深度学习:卷积神经网络CNN

目录 一、什么是卷积&#xff1f; 二、卷积神经网络的组成 1. 卷积层 2. 池化层 3. 激活函数 4. 全连接层 三、卷积神经网络的构造 四、代码实现 1.数据预处理 2.创建卷积神经网络 3.创建训练集和测试集函数 4.创建损失函数和优化器并进行训练 一、什么是卷积&…

Kivy,一个上天入地的 Python 库

大家好&#xff01;我是炒青椒不放辣&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

USB 电缆中的信号线 DP、DM 的缩写由来

经常在一些芯片的规格书中看到 USB 的信号对是以 DP 和 DM 命名&#xff1a; 我在想&#xff0c;这些规格书是不是写错了&#xff0c;把 N 写成 M 了&#xff1f;DM 中的 M 到底是什么的缩写&#xff1f; 于是我找了一些资料&#xff0c;终于在《Universal Serial Bus Cables …

string 的介绍及使用

一.string类介绍 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&a…

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开&#xff0c;发现是一段PT2242 信号 PT2242信号 有长有短&#xff0c;短的为0&#xff0c;长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

ssm病人跟踪治疗信息管理系统

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎大家咨询留言 摘 要 病人跟踪治疗信息管理系统采用B/S模式&#xff0c;促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段&#xff0c;管理效率极低&#xff0c;随着病人的不断…

《SG-Former: Self-guided Transformer with Evolving Token Reallocation》ICCV2023

摘要 SG-Former&#xff08;Self-guided Transformer&#xff09;是一种新型的视觉Transformer模型&#xff0c;旨在解决传统Transformer在处理大型特征图时面临的计算成本高的问题。该模型通过一种自适应细粒度的全局自注意力机制&#xff0c;实现了有效的计算成本降低。它利…

VmWare安装虚拟机教程(centos7)

VMWare下载&#xff1a; 下载 VMware Workstation Pro - VMware Customer Connect 安装包&#xff1a;&#xff08;16的版本&#xff09;免费&#xff01;&#xff08;一个赞就行&#xff09; 一直点下一步即可&#xff0c;注意修改一下安装位置就好 二、安装虚拟机 安装虚…