C. Peaceful Rooks(并查集找环)
创始人
2024-01-22 13:23:51
0

Problem - 1411C - Codeforces

题意:

你会得到一个n×n的棋盘。棋盘的行和列从1到n编号。单元格(x,y)位于列号x和行号y的交点上。

车是一个棋子,它可以在一个回合内垂直或水平地移动任何数量的单元。棋盘上有m个车(m

在一个回合中,你可以在垂直或水平方向上移动其中一个车的任何数量的单元。此外,它在移动后不应该受到任何其他车的攻击。将所有的车放在主对角线上所需的最少步数是多少?

棋盘的主对角线是所有的单元格(i,i),其中1≤i≤n。

输入
第一行包含测试案例的数量t(1≤t≤103)。下面是对t个测试用例的描述。

每个测试案例的第一行包含两个整数n和m--棋盘的大小和车的数量(2≤n≤105,1≤m

所有测试案例的n之和不超过105。

输出
对于每一个测试实例,打印一个整数--将所有棋子放在主对角线上所需的最小棋步数。

可以证明,这总是可能的。

题解:
因为我们要把点都移到对角线上,并且没有一对车共用一行或一列的情况。

我们不妨倒着来看,如果对角线上的点设为(i,i),如果对于这样的点只有一个点在他攻击范围内,是不是可以直接移动到这个点,当然也会有几个点在一个对角线点的攻击范围内的,对于这样的点,是不是只用走两步即可

那么如何判断是否冲突了呢?
可以用并查集维护,对于点(x,y),用并查集合并x和y,表示(x,x)和(y,y)在一个点(x,y)的攻击范围内,
如果合并之前发现x和y已经在同一集合,那么说明和其他点出现了冲突,此时总步数需要+1。

最后要注意的是,如果一个点一开始就在对角线上,那么忽略不计。
 

 

#include
#include
#include
#include
#include
#include
using namespace std;
int f[100050];
int find(int x)
{if(f[x] == x)return x;return f[x] = find(f[x]);
}
void solve()
{int n,m;cin >> n >> m;int ans = 0;int cnt = 0;for(int i = 1;i <= n;i++)f[i] = i;for(int i = 1;i <= m;i++){int x,y;cin >>x >>y;if(x == y)continue;int a = find(x);int b = find(y);if(a!=b){f[a] = b;}else{cnt++;}ans++;} cout<> t;while(t--){solve();}
}
//
//

相关内容

热门资讯

成都警方通报:网上约拍线下发生... 中新网成都1月19日电 (记者 安源)1月19日,成都市公安局锦江区分局发布警情通报称,网上约拍线下...
最高法:对因拖欠工资、高额彩礼... 新京报讯(记者陈璐)1月19日,最高人民法院召开全国高级法院院长会议,会议总结2025年法院工作,并...
最高检:去年前11月起诉危险驾... 南都讯 记者刘嫚 发自北京 记者从1月19日召开的全国检察长会议上了解到,去年前11月,检察机关受理...
萃华珠宝(002731)披露累... 截至2026年1月19日收盘,萃华珠宝(002731)报收于13.1元,较前一交易日上涨3.23%,...
上海自贸区构建国际化、专业化调... 中新网上海1月19日电 (记者 陈静)随着上海自贸区涉外经贸活动日益频繁,商事纠纷解决机制的创新完善...
最高法:有力惩治利用人工智能技... 新京报讯(记者陈璐)1月19日,最高人民法院召开全国高级法院院长会议。记者从会上获悉,2026年人民...
上合示范区2025年推出20项... 中新网青岛1月19日电(王禹)记者19日从中国—上海合作组织地方经贸合作示范区(简称“上合示范区”)...
2025年破坏社会主义市场经济... 中新网北京1月19日电 (记者 张素)记者19日从在北京举行的全国高级法院院长会议获悉,2025年,...
司法部:2025年审查完成53... 中新网北京1月19日电 (记者 谢雁冰)记者19日从司法部召开的全国司法厅(局)长会议上获悉,202...
宏达股份(600331)披露提... 截至2026年1月19日收盘,宏达股份(600331)报收于13.44元,较前一交易日上涨0.6%,...