CodeForces 74 C.Chessboard Billiard(并查集)
Description
给出一个n∗mn*m的棋盘, 可以在格子里放小球,但是需要保证任意两个小球不可达,一个小球每次可以选择东南,东北,西南,西北四个方向中的一个运动,遇到边界就反弹,遇到角就原路返回,如果若干次反弹后可以到达另一个小球的位置则称这两个小球互相可达。问最多可以放多少小球
Input
两个整数n,mn,m表示棋盘规模(2≤n,m≤106)(2\le n,m\le 10^6)
Output
输出最多可以放的小球数量
Sample Input
3 4
Sample Output
2
Solution
如果两个小球可以到达边界的同一位置那么显然这两个小球互相可达,如果两个小球互相可达,那么这两个小球也必然可以到达边界的同一位置,故两个小球可达的边界位置不同等价于这两个小球不可达,用并查集维护2m+2n−42m+2n-4个边界位置的可达关系,最终得到的集合数即为最多可以放置的小球数
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=4000005;
int n,m,fa[maxn];
int find(int x)
{if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{x=find(x),y=find(y);if(x==y)return ;fa[x]=y;
}
int ID(int x,int y)
{if(x==1)return y;if(y==m)return m+x-1;if(x==n)return 2*m+n-1-y;return 2*m+2*n-2-x;
}
int main()
{while(~scanf("%d%d",&n,&m)){for(int i=1;i<=2*m+2*n-4;i++)fa[i]=i;if(n<m)swap(n,m);for(int i=1;i<=n;i++){if(i<=m)unite(ID(i,1),ID(1,i)),unite(ID(i,m),ID(1,m-i+1));else unite(ID(i,1),ID(i-m+1,m)),unite(ID(i,m),ID(i-m+1,1));if(i>=n-m+1)unite(ID(i,1),ID(n,n-i+1)),unite(ID(i,m),ID(n,m-n+i));else unite(ID(i,1),ID(m+i-1,m)),unite(ID(i,m),ID(m+i-1,1));}int ans=0;for(int i=1;i<=2*m+2*n-4;i++)if(fa[i]==i)ans++;printf("%d\n",ans);}return 0;
}
CodeForces 74 C.Chessboard Billiard(并查集)相关推荐
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- CodeForces - 1445E Team-Building(可撤销并查集)
题目链接:点击查看 题目大意:给出一张有 n 个点和 m 条边的图,每个点都有一个种类,共有 k 个种类,现在要从 k 个种类中每次选出两种,对所有 C( k , 2 ) 种组合单独讨论,对于选出的两 ...
- CodeForces - 892E Envy(可撤销并查集)
题目链接:点击查看 题目大意:给出一张由 n 个点 m 条边组成的连通图,有 q 次询问,每次询问给出一个边集,需要判断这些边是否可以同时出现在最小生成树上 题目分析:需要用到的一个性质是,对于同一个 ...
- codeforces gym-101736 Farmer Faul 平衡树+并查集
题目 题目链接 题意 给出nnn个整数,其中1≤n≤106" role="presentation" style="position: relative;&qu ...
- 【CodeForces - 731C】Socks(并查集,思维)
题干: Arseniy is already grown-up and independent. His mother decided to leave him alone for m days an ...
- Codeforces 1140F 线段树 分治 并查集
题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...
- CodeForces - 722C Destroying Array (并查集/集合的插入和删除)
原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...
- CodeForces 828C String Reconstruction(并查集思想)
题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第 ...
最新文章
- 洛谷 P1598 垂直柱状图【字符串+模拟】
- 使用Hyperledger Ursa简化区块链安全性
- 文件安全传输服务器,安全传输:从文件加载服务器证书
- [转载] 让SciTE能够和IDE一样进行成员提示
- python拷贝文件夹目录和文件_Python 拷贝文件及文件夹到远程主机目录
- SAP ABAP实用技巧介绍系列之利用RTTC给DDIC structure动态添加新的field
- netbeans代码提示_NetBeans可用性提示
- 百度之后,电子银行还安全么?
- 浅谈过程和结果的关系
- phoenix hbase java_spark通过phoenix读写hbase(Java版)
- Sphinx语音识别
- Python统计字符串中的中英文字符、数字空格,特殊字符 , 空格的个数
- 150条经典社会生存法则
- 很搞笑,今天才弄清楚什么是二级域名和三级域名的区别
- 重磅 | 华为发布绝杀计算战略!投15亿美元打造开放生态,全球最快AI训练集群Atlas 900,绝了!...
- mysql 统计每年的数据统计_Mysql统计每年每个月的数据——详细教程
- java如何连接rfid_Java + Uno + RFID:java中的调用方法读取rfid
- 游戏自评——英雄无敌手游
- 零基础学习CSS(10)——属性选择器
- ADI Blackfin DSP处理器-BF533的开发详解8:Timer定时器的驱动和应用(含源代码)