首页 > 其他分享 >ARC111B Reversible Cards 题解 (套路题)

ARC111B Reversible Cards 题解 (套路题)

时间:2024-02-21 11:44:05浏览次数:35  
标签:连通 res int 题解 ARC111B MAXN 染色 Cards 节点

考虑将 \(a_i,b_i\) 之间连边,发现题目可以被转化为给定一个图,要求对于每条边将其一个顶点染色,问最多能将多少个点染色。

于是我们对于每个连通块分开来考虑。对于一个连通块,注意到我们不能将每个顶点染色当且仅当这个连通块是树,且此时可以染色的定点数量为连通块大小减一,如下:

  1. 如果当前连通块是树,则我们可以固定一个点作为根节点,其余所有非根节点,用它连向父亲的那条边对他进行染色。
  2. 如果当前连通块不是树,则我们可以求出他的一个生成树,以一个在环中的节点作为根节点,以 (1) 的方案将这个连通块除了这个根节点以外的点染色,接下来用这个环上的与根节点连接的非树边将这个根节点染色。

于是得证,时间复杂度 \(O(n+V)\)。

const int MAXN = 4e5 + 5;
int n, a[MAXN], vis[MAXN], b[MAXN], sz[MAXN];
vector<int> G[MAXN];

bool dfs(int x, int fa) {
	vis[x] = true; sz[x] = 1;
	auto res = true;
	for (auto u:G[x]) {
		if (u == fa) continue;
		if (vis[u]) res = false;
		else res &= dfs(u, x), sz[x] += sz[u];
	}
	return res;
}

void work() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
        cin >> a[i] >> b[i];
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	}
	int N = max(*max_element(a + 1, a + 1 + n), *max_element(b + 1, b + 1 + n)), ans = 0;
	for (int i = 1; i <= N; ++i) {
		if (vis[i]) continue;
		auto res = dfs(i, 0);
		if (res) ans += sz[i] - 1;
		else ans += sz[i];
	}
	cout << ans << endl;
}

标签:连通,res,int,题解,ARC111B,MAXN,染色,Cards,节点
From: https://www.cnblogs.com/XiaoQuQu/p/18024857

相关文章

  • blocks——题解
    题目描述解析对于这道题,他要求大于k的数进行操作,所以直接让每个数减k,然后用前缀和维护一下与0比较就可以了,因为一段区间和的平均值大于k的话,那么这就是一个合法区间,即为操作后的这个区间和大于0,我们可以用一个单调递减栈去维护,先把比0小的推入栈中,因为要求最大区间,所以边界......
  • 良好的感觉——题解
    题目描述分析题目意思就是找子区间的和乘区间最小值的最小值;1.纯暴力。。。肯定TLE.2.枚举最小值,找两边第一个比它小的,求区间和。(肯定第二种)。。。实现纯循环的话肯定不行,这时候需要一点小优化——单调栈;既然枚举最小值的话,复杂度只要O(n),可以用前缀和求区间和,接下来就是......
  • P4141 消失之物题解(写给每一位与我一样的新手玩家)
    消失之物传送门:P4141消失之物-洛谷|计算机科学教育新生态(luogu.com.cn)思路暴力稳了但是hacktle了这时候我们要想办法优化这是一个回退背包问题首先第一步,我们把正常的背包(n间物体)求出来,然后就是板子,求出填满当中体积有多少种方法第二步就是回退,回退的关键问题......
  • luogu5021题解
    形式化题意:在一棵树上找\(m\)条没有重复边的路径,使得最短的路径最大,求这个最短路径的最大值。看到这个最大值就想二分答案。\(1\lem\len-1\),我们可以将长度的下限为最短的那条边,此时所有边都是符合要求的路径。长度的上限为所有路径的长度除以\(m\),向下取整。我们在判断......
  • 2024年2月20号题解
    P5594【XR-4】模拟赛解题思路重点是怎么判断是不是同一套模拟题用一个数组来标记是不是同一套题代码实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<time.h>#include<stdbool.h>#defi......
  • B3893 [NICA #3] 一键三连 题解
    本文同步发布于洛谷博客水题啊,我发现chen_zhe上传的水题这么多呢?难道kkksc03把水题都交给他上传了?题意简述输入两个整数\(x\)和\(y\),输出\(x+y\times2\)。我能直接上代码吗好的,让我们通过做题认识一下相关的知识点:YF001int类型与输入输出YF002数与数之间的运......
  • 线段树-山海经 题解
    《最痛苦的一集》从开始的找维护变量到依据i比较依据y比较最后发现问题出在没初始化(如果不将答案赋值为极小值那么它最小值就是0因此wa了无数遍下面是思路首先要维护的变量有:\(区间的左右边界\,l,\,r\)\(区间的答案\,ans\)\(含左端点最大值\,lans\,和含右端点最......
  • 【解题报告】【比赛复现】洛谷入门赛 #17 题解
    洛谷入门赛#17题解今日推歌:《春嵐feat.初音ミク》john感觉这首都快成周榜战神了(Before关于我做入门赛的精神状态:没做T4,因为题面读得我头疼……而且大模拟不想做(虽然也不是多大的模拟展开目录目录洛谷入门赛#17题解BeforeA食堂B数学选择题AfterC风球E式神考核Af......
  • CF1905D Cyclic MEX 题解
    题意:给定一个长度为\(n\)的排列\(a\),\(a_i\in[0,n-1]\)。你可以将这个排列进行循环移位,最小化\(\sum_{i=1}^{n}\text{mex}_{j=1}^ia_j\)的值。首先我们可以先计算出最初情况下每一个\(i\)位置的\(\text{mex}\)值。这个序列一定是单调非严格递增的。首先有一个比......
  • CF1893B Neutral Tonality 题解
    很巧妙的一道题。为了让\(\text{LIS}\)长度最小,我们肯定先将\(b\)数组降序排序,这样\(b\)自身对\(\text{LIS}\)的贡献最小。考虑是否存在一种插入方式使得最终\(a\)的\(\text{LIS}\)长度和最初\(a\)的\(\text{LIS}\)长度相等。这时我们会发现,如果我们插入\(b\)......