首页 > 其他分享 >CF1411C - Peaceful Rooks | 思维

CF1411C - Peaceful Rooks | 思维

时间:2024-03-26 16:33:56浏览次数:25  
标签:CF1411C Rooks return vis int include 棋子 Peaceful 移动

links

在一个 \(n \times n\) 的棋盘上有 \(m(m < n)\) 个棋子。若棋子处于同一行或同一列便认为他们可以互相攻击。初始时棋子之间均不可互相攻击。你可以进行若干次操作,每次操作可以将棋子纵向移动任意格或横向移动任意格,要求移动之后棋子之间不能互相攻击。求使得棋子均处在主对角线上的最小操作次数。

这道题本该很简单,但当时想的时候一如既往的失了智,导致做得很慢。

我们先考虑纵向移动的情况,一颗棋子 \((x, y)\) 要移动到 \((y, y)\)。理想的情况是棋子移动过去,没有冲突,但是如果第 \(y\) 行已被占用,比如说被 \((y, z)\) 占用,就需要 \((y, z)\) 挪位置。挪到哪里呢,挪到 \((z, z)\) 显然是可靠的。但是如果第 \(z\) 行也被占用了呢?那就继续往前挪。这样一来要么成一条链,要么成一个环。若是成一个环的话,那就需要一枚棋子移动到空旷的地方暂且避让,这就会使操作数增加一步。于是每次连边 \((x, y) : x \rightarrow y\) ,然后数环即可。

那么横向移动的情况呢,可以发现是建反向边,和纵向移动一样,两种移动方式我们采取一种即可。

当时的思路是很混乱的,只想到第一层,就是一个环或者一条链的情况,然后各种判断,果然还是一叶障目了。

#include <iostream> 
#include <cstdio>
#include <cstring>
	using namespace std;
	int edg[100005];
	bool vis[100005];
int dfs(int u) {
	if (u == 0) return 0;
	if (vis[u]) return u;
	vis[u] = true;
	return dfs(edg[u]);
}
int main() {
	int T = 0;
	scanf("%d", &T);
	for (int G = 1; G <= T; G++) {
		int n = 0, m = 0, ans = 0;
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; i++)
			edg[i] = 0, vis[i] = false;
		for (int i = 1; i <= m; i++) {
			int x = 0, y = 0;
			scanf("%d%d", &x, &y);
			if (x != y) ans++;
			edg[x] = y;
		}
		for (int i = 1; i <= n; i++) {
			if (edg[i] == 0 || edg[i] == i)
				continue;
			if (!vis[i]) {
				if (dfs(i) == i) ans++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

标签:CF1411C,Rooks,return,vis,int,include,棋子,Peaceful,移动
From: https://www.cnblogs.com/kirakiraa/p/18097008

相关文章

  • Atcoder Grand Contest 041 F - Histogram Rooks
    考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为\(A\)。把与\(A\)中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是\(2^{\text{剩余点的个数}}\),乘以\((-1)^{|A|}\)并求和即可。这个做法直接优化显然不行。我们考虑设\(A\)中的点所在的列组成的不可重集......
  • [AGC041F] Histogram Rooks 题解
    题目链接点击打开链接题目解法好牛(难)的题!!!所有都被覆盖不难想到容斥暴力的容斥是钦定集合\(S\)中的位置都没被覆盖,然后把不能填棋子的点都去掉,假设剩下的不受限制的点的个数为\(c\),则答案为\(\sum2^c(-1)^{|S|}\)这个暴力是很难直接优化的如果一列被有点被钦定了,那么......
  • 《计算机科学概论 第12版》[美]J.Glenn Brookshear Denis Brylow 译者:刘艺,吴英,毛
    《计算机科学概论》是计算机科学概论课程的经典教材,全书对计算机科学做了百科全书式的精彩阐述,充分展现了计算机科学的历史背景、发展历程和新的技术趋势。《计算机科学概论》首先介绍的是信息编码及计算机体系结构的基本原理,进而讲述操作系统和组网及因特网,接着探讨算法、程序设......
  • 计算机科学概论 (第10版) 作者: [美] J.Glenn Brookshear 译者: 刘艺 / 肖成海 / 马小
    计算机科学概论(第10版)  更新图书信息或封面作者: [美]J.GlennBrookshear出版社: 人民邮电出版社出品方: 图灵教育原作名: ComputerScience:AnOverview译者: 刘艺 / 肖成海 / 马小会出版年: 2009-9页数: 411定价: 59.00元装帧: 平装丛书: 图灵......
  • AtCoder Grand Contest 041 F Histogram Rooks
    洛谷传送门AtCoder传送门神题!!!!!!!!!/bx全部格子都被覆盖不好处理,考虑钦定\(k\)个格子不被覆盖,容斥系数就是\((-1)^k\)。发现网格的行不一定连续,但是列是连续的。如果一列有格子被钦定,那么这一列就不能放棋子。由此想到枚举不能放棋子的列(至少有一个棋子被钦定的列)集合\(S\),把......
  • PeacefulTeams
    [ABC310D]PeacefulTeams考虑状压DP。令\(f[i][S'][S]\)表示已经分配到了第\(i\)组,且该组的人集合为\(S'\),分配过的人集合为\(S\)方案数。假设加入一个人\(j\),则\(f[i][S'][S]->f[i][S'|j][S|j]\)(当然需要满足一定条件)或者加入之后新分了一组,则\(f[i][S'][S]->f[i+......
  • [ABC310D] Peaceful Teams 题解
    PeacefulTeams题目大意将\(n\)个人分成\(T\)组,要求每组不能包含敌对的人,问有多少种分法。思路分析注意到\(n,T\)均很小,考虑爆搜。注意到直接枚举会枚举到分组顺序的全排列,所以可以强行嵌定大小关系去重。voiddfs(ints){if(s==n+1){for(inti=1;i<=t;......
  • RookScore
    [ABC298F]RookScore关键在于如何排除交叉位置计算两次的干扰。首先进行离散化,行和列是独立的,所以可以分别对行和列离散化。考虑到可以枚举每一行,而每次覆盖到的点可以在线段树中减去这一行的点,然后查询答案;最后再修改回去。也可以直接用一个set,然后搞一个数组存储现在的情......
  • (转)史上人间清醒的芝大毕业演讲:圆满的人生,是从开放式选择走向甜蜜献身 -- 大卫·布鲁
      https://www.bilibili.com/video/BV1ch411c747/?spm_id_from=333.1007.tianma.1-2-2.click&vd_source=e4991eff671e2c8b3ce1f748b6cca451史上人间清醒的芝大毕业演讲:圆满的人生,是从开放式选择走向甜蜜献身大卫·布鲁克斯(DavidBrooks) the need to be careful about......
  • CF1621A Stable Arrangement of Rooks
    题目简述:一个n*n的棋盘上,放上k个车,使得一任意车向上下左右移动一格(这里的车可以上下左右移动任意步数)后不与其他车相撞(注:不能走出棋盘之外)。个人分析:从题目可知,在车上下左右移动一格后不会与其他车相撞,换句话说,两辆车之间至少相隔一行一列,放在对角线上是最优想法,若无解则......