CSU 2167

news/2024/10/17 23:25:48/

题意:初始有n*m的点,矩形排列。有2种操作,第一种是将第i行的所有点联通(a<=i<=b),第二种是将第i列的所有点联通(a<=i<=b)。每次操作后输出有多少个联通块。

分析:在纸上画一下图,可以发现答案跟a,b所跨水平和垂直区间有关,如图,假设nn为水平方向所占用的区间,mm为垂直方向所占的区间,且共有n行m列,则它是把mm×m+nn×n-nn×mm个点连通成一个点,所以答案ans=n×m-(mm×m+nn×n-nn×mm)+1=n×m-mm×m-nn×n+nn×mm+1,但注意当水平方向占的区间为0时,是将mm行的点连通成mm个点,即mm×m个点连通成mm个点,此时ans=n×m-mm×m+mm,当垂直方向区间为0时也可想而知。普通线段树来统计空间肯定不行,可以用动态开点解决,每次更新最多新开几十个节点的空间,1e5次更新,最多只需几百万的空间足够,解决了这个问题就是水题了。这题也可以用离散化+线段树来做,不过麻烦一点,可以参考https://blog.csdn.net/nudt_spy/article/details/82682090。

å¨è¿éæå¥å¾çæè¿°

参考博客:http://www.pianshen.com/article/600592796/

https://blog.csdn.net/ccsu_cat/article/details/83376921

线段树动态开点参考:https://www.cnblogs.com/Miracevin/p/9582486.html

动态开点的思想和主席树很像。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e6;
int ls1[N],ls2[N],rs1[N],rs2[N],s1[N],s2[N];
int n,m,q,op,a,b,ct1,ct2,rt1,rt2;void up1(int& o,int l,int r,int ql,int qr) {if(!o) o=++ct1;if(s1[o]==r-l+1) return ;///已经全部连通则直接返回if(ql<=l&&qr>=r) {s1[o]=r-l+1;return ;}int m=(l+r)/2;if(ql<=m) up1(ls1[o],l,m,ql,qr);if(qr>m) up1(rs1[o],m+1,r,ql,qr);s1[o]=s1[ls1[o]]+s1[rs1[o]];
}void up2(int& o,int l,int r,int ql,int qr) {if(!o) o=++ct2;if(s2[o]==r-l+1) return ;if(ql<=l&&qr>=r) {s2[o]=r-l+1;return ;}int m=(l+r)/2;if(ql<=m) up2(ls2[o],l,m,ql,qr);if(qr>m) up2(rs2[o],m+1,r,ql,qr);s2[o]=s2[ls2[o]]+s2[rs2[o]];
}int main() {while(~scanf("%d%d%d",&n,&m,&q)) {rt1=rt2=ct1=ct2=0;while(q--) {scanf("%d%d%d",&op,&a,&b);ll res=0;if(op==1) {up1(rt1,1,n,a,b);///容斥if(s2[1]==0) res=1LL*n*m-1LL*s1[1]*(m-1);else res=1LL*n*m-1LL*s1[1]*m-1LL*s2[1]*n+1LL*s1[1]*s2[1]+1;}else {up2(rt2,1,m,a,b);if(s1[1]==0) res=1LL*n*m-1LL*s2[1]*(n-1);else res=1LL*n*m-1LL*s1[1]*m-1LL*s2[1]*n+1LL*s1[1]*s2[1]+1;}printf("%lld\n",res);}///清空 用了多少清空多少for(int i=1;i<=ct1;i++) ls1[i]=rs1[i]=s1[i]=0;for(int i=1;i<=ct2;i++) ls2[i]=rs2[i]=s2[i]=0;}return 0;
}

 


http://www.ppmy.cn/news/327780.html

相关文章

微星z370黑苹果_记录一下装了第二台黑苹果(Z370 + High Sierra)

这几天意识到自己还是得有台比较快的 Mac&#xff0c;14 Mid 的 13 寸接屏幕用起来麻烦&#xff0c;而且速度堪忧&#xff0c;所以看了看主板背面的 M.2 插槽&#xff0c;就决定来装个黑苹果。 配置单如下&#xff1a; PCPartPicker part list: https://pcpartpicker.com/list/…

P1716 双调序列

题目描述 电脑组的童鞋们经常玩一些智力PK小游戏&#xff0c;某月某日&#xff0c;发源于小朋友又发明了一种新的序列&#xff1a;双调序列&#xff0c;所谓的双调呢主要是满足如下条件描述&#xff1a; 假定有n(n<1000)个整数&#xff08;都在longint范围内&#xff0c;即…

2166 Eocnding

给定一个只包含“A”—“Z”的字符串&#xff0c;我们可以使用以下方法对其进行编码:1 .每个包含k个相同字符的子字符串都应该编码为“kX”&#xff0c;其中“X”是该子字符串中的唯一字符。2.如果子字符串的长度为1&#xff0c;则应忽略“1”。输入第一行包含一个整数N (1 <…

74LVC1G3157GW

制造商编号&#xff1a;74LVC1G3157GW 制造商&#xff1a;nxp半导体 说明&#xff1a;多路复用开关 IC 产品: 复用器/解复用器 安装风格: 贴片/贴片 封装 / 箱体: TSSOP-6 通道数量: 2通道 配置: 1 x 2:1 电源电压-最小: 1.65V 电源电压-: 5.5V 最小双重电源电压: - …

【WCH】CH32F203基于硬件I2C + SSD1306 OLED跑图形库

【WCH】CH32F203基于硬件I2C SSD1306 OLED跑图形库 &#x1f388;基于STM32图形库开源项目地址&#xff1a;https://github.com/hello-myj/stm32_oled&#x1f4cc;相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》&#x1f4cd;《【WCH】CH32F203软件I2C驱动SSD1306 OLED》…

SuperIo-Nct6106d

SuperIo的调试 SuperIo简称SIO,是一款Lpc设备芯片,支持多接口扩展. 文章目录 SuperIo的调试SIO 包含哪些功能?如何通过Lpc来初始化SIO?Global Controller RegisterUART Func SIO 包含哪些功能? 虽不同款芯片支持的功能可能不尽相同,但是大体流程和基本功能还是很相近的,下面…

D17 K108-K161

K108 1.Array对象属性 2.定义和用法 3.push&#xff08;&#xff09; 该方法可以向数组的末尾添加一个或多个元素&#xff0c;并返回数组的新的长度 1&#xff09;可以将要添加的元素作为方法的参数传递 这些元素将自动添加到数组的末尾 <script>…

Python函数的默认参数和关键字参数(通过故事来学习)

曾经有一个小企鹅&#xff0c;他是一位烤饼师。他喜欢为他的朋友制作各种口味的烤饼。有些朋友只喜欢单一的口味&#xff0c;有些则喜欢在烤饼上加一些额外的材料。 有一天&#xff0c;他遇到了一只聪明的狐狸。狐狸告诉小企鹅可以使用可变参数来处理不同数量的口味和额外材料…