【uoj#142】【UER #5】万圣节的南瓜灯 乱搞+并查集
给出一张 $n\times m$ 的网格图,两个格子之间有一条双向边,当且仅当它们相邻,即在网格图中有一条公共边。
特殊地,对于 $1\le x\le n$ ,$(x,1)$ 和 $(x,m)$ 也视为相邻。但对于 $1\le y\le m$ ,$(1,y)$ 和 $(n,y)$ 不视为相邻。
现在这张网格图有 $k$ 个格子坏掉了,你需要判断剩下的部分是否形成一张无向无环连通图。
$n,m\le 10^9$ ,$k\le 10^5$ 。
题解
乱搞+并查集
对于剩下的图:点数为 $nm-k$ ,边数大于等于 $2nm-m-4k$ 。
由于剩下的部分是一棵树,因此有点数大于边数,即 $nm-k>2nm-m-4k$ 。
整理得 $(n-1)·m<3k$ 。
由于 $k$ 只有 $10^5$ ,因此 $(n-1)·m$ 只有 $3\times 10^5$ 。又因为 $n\le 3$ ,因此 $nm$ 也只有 $4.5\times 10^5$ 。
经过构造后得出最大的 $nm$ 在 $n=4,m=99999$ 时取到,为 $399996$ 。
因此当满足 $(n-1)·m<3k$ 时暴力(数组要开到 $449997$ 以上),否则输出No即可。时间复杂度 $O(449997T)$ 。
或当满足 $nm\le 400000$ 时暴力(数组要开到 $400000$ 以上),否则输出No即可。时间复杂度 $O(400000T)$ 。
#include <cstdio>
#include <cstring>
#define pos(i , j) ((i - 1) * m + j)
int v[450010] , f[450010];
int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
}
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
memset(v , 0 , sizeof(v));
int n , m , k , i , j , x , y , c = 0;
scanf("%d%d%d" , &n , &m , &k);
if(1ll * n * m >= m + 3 * k)
{
while(k -- ) scanf("%*d%*d");
printf("No");
if(T) puts("");
continue;
}
for(i = 1 ; i <= k ; i ++ ) scanf("%d%d" , &x , &y) , v[pos(x , y)] = 1;
for(i = 1 ; i <= n * m ; i ++ ) f[i] = i;
for(i = 1 ; i <= n ; i ++ )
{
for(j = 1 ; j <= m ; j ++ )
{
if(!v[pos(i , j)])
{
if(i < n && !v[pos(i + 1 , j)]) f[find(pos(i , j))] = find(pos(i + 1 , j)) , c ++ ;
if(!v[pos(i , j % m + 1)]) f[find(pos(i , j))] = find(pos(i , j % m + 1)) , c ++ ;
}
}
}
if(c != n * m - k - 1) printf("No");
else
{
for(i = 1 ; i <= n * m ; i ++ )
if(!v[i])
x = find(i);
for(i = 1 ; i <= n * m ; i ++ )
if(!v[i] && find(i) != x)
break;
if(i <= n * m) printf("No");
else printf("Yes");
}
if(T) puts("");
}
return 0;
}
【uoj#142】【UER #5】万圣节的南瓜灯 乱搞+并查集的更多相关文章
- HDU 1272 小希的迷宫(乱搞||并查集)
小希的迷宫 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有 ...
- 【uoj#209】[UER #6]票数统计 组合数+乱搞
题目描述 一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种.现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ .$y_i$ ,要求至少满足以下两个条件之一: 序列的 ...
- 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)
传送门 题意简述: 要求支持以下操作: 在a与b之间连一条长度为i的边(i是操作编号):删除当前图中边权最大的k条边:表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作. 要求在每次操作后 ...
- Uoj #131. 【NOI2015】品酒大会 后缀数组,并查集
#131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...
- UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)
显然可以用可持久化并查集实现.考虑更简单的做法.如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊.加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销 ...
- UOJ #142. 【UER #5】万圣节的南瓜灯 并查集
#142. [UER #5]万圣节的南瓜灯 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/142 Descrip ...
- 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)
题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...
- UOJ_14_【UER #1】DZY Loves Graph_并查集
UOJ_14_[UER #1]DZY Loves Graph_并查集 题面:http://uoj.ac/problem/14 考虑只有前两个操作怎么做. 每次删除一定是从后往前删,并且被删的边如果不是 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
随机推荐
- 如何为一个高负荷站点配置tomcat连接器(connector)【译文】(第一篇)
引言 最近正好要用到这些内容,因此就找了一篇比较有分量的文章,思来想去,还是尝试写一下译文吧.其实LZ的英语是非常烂的(四级没过的LZ眼泪掉下来),因此这篇文章翻译的水平LZ自己也不敢恭维.各位猿友大 ...
- 大数据中Linux集群搭建与配置
因测试需要,一共安装4台linux系统,在windows上用vm搭建. 对应4个IP为192.168.1.60.61.62.63,这里记录其中一台的搭建过程,其余的可以直接复制虚拟机,并修改相关配置即 ...
- Charles 抓包使用教程
将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Https 通讯信息 模拟慢速网络 修改网络请求内容 给服务器做压力测试 修改服务 ...
- 记录Centos7搭建ftp服务器以及遇到的各种坑
前言 今天被经理要求搭建ftp服务器,然后就去网上搜索了一下教程.搭建成功后(遇到的坑不少)特此记录一下.因为是为了记录一下整个操作流程以防以后使用所以比较啰嗦. 目录 1.安装vsftpd 2.创建 ...
- Oracle执行SQL查询语句的步骤
Oracle执行SQL查询语句的步骤 如果用户在SQL*Plus下输入了如下查询语句:SELECT * FROM dept: 查询语句的处理主要包括三个过程:编译(parse).执行(execute) ...
- Python中的装饰器的初步理解
什么是装饰器? 装饰器的本质是一个函数,其作用是用来装饰其他的函数,给其他函数附加行的功能. 原则: 1.不能修改被装饰函数的源码. 2.不能改变被装饰函数的调用方式. 那么什么是函数? 简单的来说: ...
- Java SE练习题——求奇数
欢迎来到Java SE练习题频道,我是Fishing,今天我带来的练习题是(做题会有不足之处,可评论,说出更好的方法): 通过键盘输入两个整数,计算这两个整数之间的所有奇数之和,并输出计算结果. 看到 ...
- dom学习要点
Dom操作 1.文本内容操作 - innerText:操作文本 - innerHtml:操作全内容 //innerText标签: <div id='i2' ><a>土味程序员& ...
- Hyperledger Fabric(v1.2.0)代码分析1——channel创建
Hyperledger Fabric(v1.2.0)代码分析1--channel创建 0. e2e_cli Hyperledger Fabric提供了一个e2e的例子,该例中创建了一个基础的区块链网络 ...
- tar.gz 文件解压 (安装 netbean 时会用到)
sudo tar xvf jdk-7u45-linux-i586.tar.gz -C /usr/lib 参考文章 http://hi.baidu.com/xiaomeng008/item/5e787b ...