CF1465-C. Peaceful Rooks
CF1465-C. Peaceful Rooks
预备小知识:
Rook(国际象棋中的车)。
国际象棋中的棋子。每人有2个,他只能直走,不能斜走,除王车易位外不能越子。
—— 来自《百度百科》
题意:
题目给出一个\(n\times n\)的棋盘,棋盘中有\(m(m<n)\)个车。最一开始任意两个车都不能打到对方(即都不在同一行或同一列)。
每一个回合你可以让一个车水平或垂直移动任意距离,但是要求车移动后不能让其他车可以打到它。现在问你至少多少回合之后,所有车能够都移动到主对角线上。
思路:
正常情况下每个车直接移动到它对应的主对角线上肯定是最优解。
但是大部分情况下车要移动到它对应的主对角线上的时候会发现那个位置要么所在行有车,要么所在列有车,那么所在行或列上的那个棋子就要先移动到那个棋子对应的主对角线上,但是又发现那个棋子对应主对角线上的位置的行或列有车,那么就要... ...这种最终会有两种情况发生:
一种是最终的棋子对应的主对角线位置所在行或列上都没有棋子,那么这时候它以及它之前的所有棋子都可以一步到达主对角线上;
另一种是最终的棋子对应的主对角线位置所在行或列上有棋子,并且这个棋子是第一个棋子,即形成了这样的环:\(a->b->c->d->a\),那么这时候只要也只有破坏这个环之后,才能把每个棋子移动到主对角线位置。破坏的方法其实很简单,只要把环中的某一个棋子移动到一个所在行所在列没有其他棋子的位置就可以破坏这个环,等其他棋子都移动到主对角线上再把这个棋子移动到它对应的主对角线上即可。这样第二种情况移动的总次数就是环中所有棋子的个数加一(破坏环的时候多移动了一步)。
判断环就用并查集就可以(本蒟蒻一开始还用dfs。。),每个车\((x, y)\)相当于一个边连接了点\(x\)和点\(y\),答案就是不在对角线上车的数量加上环的数量。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
const int maxn = 100005;
int father[maxn];
int Find(int x) {
return father[x] == x ? x : father[x] = Find (father[x]);
}
void Union(int u, int v) {
if (Find(u) != Find(v)) {
father[Find(u)] = Find(v);
}
}
int main() {
int T, n, m;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &m);
for (int i = 0; i <= n; i++) {
father[i] = i;
}
int u, v;
int ans = 0;
for (int i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
if (u == v) {
continue;
} else if (Find(u) == Find(v)) {
ans += 2;
} else {
ans += 1;
Union(u, v);
}
}
printf("%d\n", ans);
}
return 0;
}
CF1465-C. Peaceful Rooks的更多相关文章
- Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3) C. Peaceful Rooks (思维,dsu找环)
题意:一个棋盘上有一些"车",现在要让这些"车"跑到左倾斜的对角线上,每次可以移动一个棋子,但是棋盘的任意时刻都不能出现一个"车"能吃另一个 ...
- Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)
A.In-game Chat 题目:就是从后面数连着的'('的个数是不是严格比剩下的字符多 思路:水题,直接从后往前遍历即可 代码: #include<iostream> #include ...
- UVA - 11134 Fabled Rooks[贪心 问题分解]
UVA - 11134 Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to t ...
- (light OJ 1005) Rooks dp
http://www.lightoj.com/volume_showproblem.php?problem=1005 PDF (English) Statistics Forum Tim ...
- 01_传说中的车(Fabled Rooks UVa 11134 贪心问题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定 ...
- uva 11134 fabled rooks (贪心)——yhx
We would like to place n rooks, 1 n 5000, on a n nboard subject to the following restrictions• The i ...
- L - Fabled Rooks(中途相遇法和贪心)
Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...
- UVA 11134 - Fabled Rooks(贪心+优先队列)
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
- 贪心 uvaoj 11134 Fabled Rooks
Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...
随机推荐
- node爬虫 -- 网页图片
相信大家都听说过爬虫,我们也听说过Python是可以很方便地爬取网络上的图片,但是奈何本人不会Python,就只有通过 Node 来实践一下了. 接下来看我如何 板砖 ! !!
- SAP中用户口令状态的一点说明
数据元素:XUPWDSTATE 数值 内涵 -2(通常)不能更改口令.-1(每天只允许一次)今天不能更改口令.0可以更改口令,但没有必要更改.1口令为初始值必须更改口令.2口令过期必须更改口 ...
- 一句话木马拿下webshell
1.我们先建立一个简单的一句话木马文件,我们这里就命名为shell2吧. 2.因为提交的文件可能是有过滤的,我们这个靶场的这个题目就是禁止上传危险的文件类型,如jsp jar war等,所以就需要绕过 ...
- [Usaco2006 Nov]Corn Fields牧场的安排
题目描述 Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土 ...
- 学习Java第三天
方法重载:同一个类,方法名相同,参数不同(个数不同,类型不同,顺序不同),判断是否重载,只看方法名和参数,跟返回值无关. IDEA查看方法源代码:Crtl + 鼠标左键 进制表示 Java数值默认为十 ...
- kafka项目经验之如何进行Kafka压力测试、如何计算Kafka分区数、如何确定Kaftka集群机器数量
@ 目录 Kafka压测 Kafka Producer(生产)压力测试 Kafka Consumer(消费)压力测试 计算Kafka分区数 Kafka机器数量计算 Kafka压测 用Kafka官方自带 ...
- 如何配置 Slf4j
一,前言 日常开发中经常需要在控制台输出一些信息,如果这些东西不加管理,那么很容易就被输出信息淹没.幸好,我们有日志相关的库来帮助我们格式化控制台的输出. 这篇文章将介绍如何配置 Slf4j 及其具体 ...
- ubuntu14.04 LEMP(linux+nginx+mysql+php5)构建环境
Install LEMP (Linux, Nginx, MySQL and PHP) Stack on Ubuntu Linux 14.04 LTS by VIVEK GITE on DECEMBER ...
- UNIX DOMAIN SOCKETS IN GO unix域套接字
Unix domain sockets in Go - Golang News https://golangnews.org/2019/02/unix-domain-sockets-in-go/ pa ...
- Java——定时任务调度工具
一.什么是定时任务调度? 1.常用的定时调度工具:Timer和Quartz 二.Timer简介 1.Timer的定义以及架构 2.Timer示例 三.Timer的定时调度函数 1.schedule的四 ...