树状数组,线段树,容斥,P3801 红色的幻想乡

P3801 红色的幻想乡 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目背景

蕾米莉亚的红雾异变失败后,很不甘心。

题目描述

经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放。

我们将幻想乡看做是一个n×m的方格地区,一开始没有任何一个地区被红雾遮盖。蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区。如果两阵红雾碰撞,则会因为密度过大而沉降消失。灵梦察觉到了这次异变,决定去解决它。但在解决之前,灵梦想要了解一片范围红雾的密度。可以简述为两种操作:

1 x y 蕾米莉亚站在坐标(x,y) 的位置向四个方向释放无限长的红雾。

2 x1 y1 x2 y2 询问左上点为(x1,y1),右下点为 (x2,y2) 的矩形范围内,被红雾遮盖的地区的数量。

输入格式

第一行三个整数n,m,q,表示幻想乡大小为 n×m,有 q 个询问。

接下来 q 行,每行 33 个或 55 个整数,用空格隔开,含义见题目描述。

输出格式

对于每一个操作 22,输出一行一个整数,表示对应询问的答案。

输入输出样例

输入 #1复制

4 4 3
1 2 2
1 4 4
2 1 1 4 4

输出 #1复制

8

说明/提示

样例输入输出 1 解释

o表示没有红雾,x表示有红雾,两次释放红雾后幻想乡地图如下:

oxox
xoxo
oxox
xoxo

数据规模与约定

  • 对于 20% 的数据,1≤n,m,q≤200。
  • 对于 40%40% 的数据,11≤n,m,q≤103。
  • 对于 100%100% 的数据,1≤n,m,q≤105,1≤x1​,x2​,x≤n,x1​≤x2​,1≤y1​,y2​,y≤m,y1​≤y2​。

 解析:线段树,容斥

关于这个二维数组的状态统计问题,我们需要找到一个简洁的方法,一个一个找肯定是不现实的。

这里我们应用容斥来统计:

容斥原理是一种组合数学中常用的计数技巧,用于计算多个集合的并集、交集等情况下的元素个数。容斥原理通常用于解决包含排列组合的问题,特别是计算集合的大小或元素的个数。

容斥原理的基本思想是通过将不同集合的贡献逐一相加,并在适当情况下减去重复计数的部分,以获得最终的结果。通常,容斥原理适用于处理以下问题:

1. 求多个集合的并集中元素的个数。
2. 求多个集合的交集中元素的个数。
3. 求满足某些条件的元素个数。

容斥原理的一般形式如下:

如果有n个集合A₁、A₂、...、Aₙ,那么它们的并集中的元素个数可以表示为:

|A₁ ∪ A₂ ∪ ... ∪ Aₙ| = Σ(|Aᵢ|) - Σ(|Aᵢ₁ ∩ Aᵢ₂|) + Σ(|Aᵢ₁ ∩ Aᵢ₂ ∩ Aᵢ₃|) - ... + (-1)ⁿ⁻¹ |A₁ ∩ A₂ ∩ ... ∩ Aₙ|

其中,Σ 表示求和,|Aᵢ| 表示集合 Aᵢ 中元素的个数,|Aᵢ₁ ∩ Aᵢ₂| 表示集合 Aᵢ₁ 和 Aᵢ₂ 的交集中元素的个数,以此类推。

容斥原理的应用范围广泛,包括组合数学、概率论、计算机科学等领域。它可以帮助解决各种计数问题,包括排列、组合、概率计算等。在解决复杂问题时,容斥原理通常是一个强大的工具,可以帮助简化问题的分析和计算。

我们可以发现这道题中的答案实际上就等于:
放过的行数×行长度+放过的列数×列长度-抵消块数。

LL ans = tx * (y1 - y + 1)) + (ty * (x1 - x + 1)) - (2 * tx * ty));

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
const int  N = 1e5 + 5;
int n, m, q;
int ax[N*4], ay[N*4];void change(int* arr, int p, int y,int l,int r) {if (l == r) {arr[p] ^= 1;return;}LL mid = (l + r)/2;if (y <= mid)change(arr, p * 2, y, l, mid);if (y > mid)change(arr, p * 2 + 1, y, mid + 1, r);arr[p] = arr[p * 2] + arr[p * 2 + 1];
}LL ask(int *arr,int p,int l,int r,int L,int R) {if (L<=l && R >= r) {return arr[p];}LL mid = (l + r) / 2;LL ret = 0;if (L <= mid)ret += ask(arr, p * 2, l, mid, L, R);if (R > mid)ret += ask(arr, p * 2 + 1, mid + 1, r, L, R);return ret;
}int main() {cin >> n >> m >> q;for (int i = 1,op,x,y,x1,y1; i <= q; i++) {scanf("%d", &op);if (op == 1) {scanf("%d%d", &x, &y);change(ax, 1, x, 1, n);change(ay, 1, y, 1, m);}else {scanf("%d%d%d%d", &x, &y, &x1, &y1);LL tx = ask(ax, 1, 1, n, x, x1);LL ty = ask(ay, 1, 1, m, y, y1);LL ans = (LL)((LL)(tx * (y1 - y + 1)) + (LL)(ty * (x1 - x + 1)) - (LL)(2 * tx * ty));printf("%lld\n", ans);}}return 0;
}

树状数组

经过上述分析,显而易见,本题也可使用树状数组来做

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
const int  N = 1e5 + 5;
int n, m, q;
int ax[N], ay[N],cx[N],cy[N];void add(int* arr,int x,int p,int d) {for (; x<=p; x += x&-x) {arr[x] +=d;}
}int sum(int* arr, int x) {int ans = 0;for (; x; x -= x & -x) {ans += arr[x];}return ans;
}int main() {cin >> n >> m >> q;for (int i = 1, op, x, y, x1, y1; i <= q; i++) {scanf("%d", &op);if (op == 1) {scanf("%d%d", &x, &y);if (ax[x] == 1)add(cx, x, n, -1);elseadd(cx, x, n, 1);ax[x] ^= 1;if (ay[y] == 1)add(cy, y, m, -1);elseadd(cy, y, m, 1);ay[y] ^= 1;}else {scanf("%d%d%d%d", &x, &y, &x1, &y1);LL tx = sum(cx, x1) - sum(cx, x - 1);LL ty = sum(cy, y1) - sum(cy, y - 1);LL ans = (LL)((LL)(tx * (y1 - y + 1)) + (LL)(ty * (x1 - x + 1)) -(LL)( 2 * ty * tx));printf("%lld\n", ans);}}return 0;
}

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

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

相关文章

监控基本概念

监控&#xff1a;这个词在不同的上下文中有不同的含义&#xff0c;在讲到监控MySQL或者监控Redis时&#xff0c;这里只涉及数据采集和可视化&#xff0c;不涉及告警引擎和事件处理。要是监控系统的话&#xff0c;不但包括数据采集和可视化&#xff0c;而且也包括告警和事件发送…

【深入解析spring cloud gateway】02 网关路由断言

一、断言(Predicate)的意义 断言是路由配置的一部分&#xff0c;当断言条件满足&#xff0c;即执行Filter的逻辑&#xff0c;如下例所示 spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgpredicates:- Path/red/{segment}filters:- AddR…

Python 编程秘籍:掌握这些,你还会担心写不出高效代码吗?

建议点击下面原文链接&#xff0c;效果更佳 Python 编程秘籍&#xff1a;掌握这些&#xff0c;你还会担心写不出高效代码吗&#xff1f; 在 Python 编程的世界里&#xff0c;高手们常常掌握着一些不为人知的独门绝技。这些技巧不仅让他们在编程时如虎添翼&#xff0c;还让他们…

Kafka3.0.0版本——文件存储机制

这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念&#xff0c…

ASP.NET Core 中基于 Controller 的 Web API

基于 Controller 的 Web API ASP.NET Wep API 的请求架构 客户端发送Http请求&#xff0c;Contoller响应请求&#xff0c;并从数据库读取数据&#xff0c;序列化数据&#xff0c;然后通过 Http Response返回序列化的数据。 ControllerBase 类 Web API 的所有controllers 一般…

uni-app app端.m3u8类型流的播放

1.开发环境&#xff1a;HBuilderX3.8.7、uni-app、vue2.0、view2.0、uni-ui 2.实现通过web-view 嵌入H5页面&#xff0c;进行视频流自动播放。 注意事项&#xff1a; 如果只是在android端可以直接使用.flv格式的视频流&#xff1b; 如果App需要支持ios就可以考虑一下播放.m3u8格…

植物大战僵尸植物表(二)

前言 此文章为“植物大战僵尸”专栏中的第007刊&#xff08;2023年9月第六刊&#xff09;。 提示&#xff1a; 1.用于无名版&#xff1b; 2.用于1代&#xff1b; 3.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)。 植物大战僵尸植物表 土豆雷窝瓜火炬树桩火爆辣椒杨…

Spring MVC @Controller和@RequestMapping注解

Controller 注解 Controller 注解可以将一个普通的 Java 类标识成控制器&#xff08;Controller&#xff09;类&#xff0c;示例代码如下。 package net.biancheng.controller; import org.springframework.stereotype.Controller; Controller public class IndexController …

数学建模:拟合算法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;拟合算法 文章目录 数学建模&#xff1a;拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…

【FPGA项目】沙盘演练——基础版报文收发

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 第1个虚拟项目 前言 点灯开启了我们的FPGA之路&#xff0c;那么我们来继续沙盘演练。 用一个虚拟项目&#xff0c;来入门练习&#xff0c;以此步入数字逻辑的大门。 Key Words&…

【网络编程】TCP/IP协议(互联网的基石)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类GO 语言当中 NEW 和 MAKE 有什么区别吗&#xff1f;PRINTF(),SPRINTF(),FPRINTF() 都是格式化输出&#xff0c;有什么不同&#xff1f;GO 语言当中数组和切片的区别是什么&#xf…

〖Python网络爬虫实战㉞〗- 图形验证码OCR识别

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度…

说说 MVCC 的工作原理?

分析&回答 多版本并发控制(MVCC) InnoDB的MVCC&#xff0c;是通过在每行记录后面保存两个隐藏的列来实现。这两个列&#xff0c;一个保存了行的创建时间&#xff0c;一个保存行的删除时间&#xff0c;并不是实际的时间&#xff0c;而是系统版本号。每开始一个新的事务&am…

华为云云服务器评测|云耀云服务器实例基础使用实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…

云计算技术相关概念--学习笔记

一.云计算相关概念 云计算是同时描述一个系统平台或者一类应用程序的术语。云计算平台按需进行动态部署&#xff0c;配置&#xff0c;重新配置预计取消服务等。在云计算平台中的服务器可以是物理或虚拟的服务器。高级的计算机云通常包含一些其他的计算资源&#xff0c;如存储区…

leetcode669. 修剪二叉搜索树(java)

修剪二叉搜索树 题目描述递归代码演示&#xff1a; 题目描述 难度 - 中等 LC - 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留…

搭建HTTPS服务器

HTTPS代理服务器的作用与价值 HTTPS代理服务器可以帮助我们实现网络流量的转发和加密&#xff0c;提高网络安全性和隐私保护。本文将指导您从零开始搭建自己的HTTPS代理服务器&#xff0c;让您更自由、安全地访问互联网。 1. 准备工作&#xff1a;选择服务器与操作系统 a. 选…

python爬虫关于ip代理池的获取和随机生成

前言 在进行爬虫开发时&#xff0c;代理IP池是一个非常重要的概念。代理IP池是指一个包含多个可用代理IP的集合&#xff0c;这些代理IP可以用来绕过网站的防爬虫策略&#xff0c;从而提高爬取数据的成功率。 在本文中&#xff0c;我们将介绍如何获取代理IP池&#xff0c;并且随…