首页 > 其他分享 >题解 ARC111B【Reversible Cards】

题解 ARC111B【Reversible Cards】

时间:2023-03-12 19:56:01浏览次数:35  
标签:cntE vis int 题解 ARC111B cntV Reversible 节点 define

我们将值域中每个数视作一个节点,将每张卡片视作连接两个节点的边,则问题转化为:对于每条边都选择一个端点,使得被选择的节点总数最大。

显然每个连通块可以分开处理。设连通块的点数、边数为 \(v,e\),可以证明这个连通块内被选择的节点总数为 \(\min\{v,e\}\):

对于每个连通块,它要么是一棵树,要么有环(废话)。显然无论哪种情况,都不可能选超过 \(\min\{v,e\}\) 个节点。

对于一棵树,我们最多选 \(e\) 个节点:指定一个点当根,每条边都选更深的节点。

对于有环的图,我们最多选 \(v\) 个节点:找出一棵生成基环树,保证环上的每条边选择的节点都不同,然后指定环当根按照与树相同的策略就可以选到环外的所有节点。

洪水填充统计每个连通块的点数、边数即可。

// Problem: B - Reversible Cards
// Contest: AtCoder - AtCoder Regular Contest 111
// URL: https://atcoder.jp/contests/arc111/tasks/arc111_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
#define likely(exp) __builtin_expect(!!(exp), 1)
#define unlikely(exp) __builtin_expect(!!(exp), 0)
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
int randint(int L, int R) {
	uniform_int_distribution<int> dist(L, R);
	return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

const int N = 4e5+5;

int n, vis[N], cntV, cntE, ans;
vector<int> e[N];

void dfs(int u) {
	vis[u] = 1;
	++cntV;
	for(int v : e[u]) {
		if(!vis[v]) dfs(v);
		++cntE;
	}
}

int main() {
	for(scanf("%d", &n); n; n--) {
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	rep(i, 1, N-1) {
		if(!vis[i]) {
			cntV = cntE = 0;
			dfs(i);
			cntE >>= 1;
			ans += min(cntV, cntE);
		}
	}
	printf("%d\n", ans);
	return 0;
}

标签:cntE,vis,int,题解,ARC111B,cntV,Reversible,节点,define
From: https://www.cnblogs.com/ruierqwq/p/arc111b.html

相关文章

  • 【题解】CF364D
    题目大意给定集合a,求最大的是大小超过一半的子集的最大公约数的数是什么。题解“超过一半”即想到随机化n次后只有\(\frac{1}{2^n}\)的几率错误,于是随机一个数判断它的......
  • 题解 P3306 [SDOI2013] 随机数生成器
    Link它\(p\)都是质数了,这不就明示我们是bsgs了吗我没看出来然后我们来倒一下\(n\)天的式子第一天是\(x_1\),第二天是\(ax_1+b\),第三天是\(a^2x_1+(ab+b)\),第四......
  • 【题解】CF1264D2
    题目大意给定一个长度为\(n\)的字符串,其中只有(,),?三种字符,其中?可以为(或者)对于一个括号序列,定义其权值为其通过删除字符后可以得到的合法的括号匹配的最深的深度,下......
  • AcWing 199. 余数之和 题解
    做了一下午……题解都看不懂,最后自己比比划划弄懂了。题意:给出\(n,k\),求\(\sum\limits_{i=1}^nk\modi\)。首先取模形式十分不好处理,所以我们可以根据取模运算定义做......
  • windows 文件夹打开默认是小窗口问题解决
    目录windows文件夹打开默认是小窗口问题解决问题解决windows文件夹打开默认是小窗口问题解决不知道误操作了什么,最近点击windows文件夹默认打开的都是小窗口,每次需要点......
  • 3 月 8 日测试题解
    3月8日测试题解T1题意给你一张图\(G=(V,E)\),\(|V|=n\),\(|E|=m\),带边权、点权。你可以执行以下操作任意多次:选取一个顶点,将其自身与与其相连的边删去当你......
  • 2023.3.12 模拟赛题解
    天黑黑题意大致:给出含\(\max\)和\(+\)的表达式以及其中的\(n\)个数,求其最大值。用前缀表达式的形式给出,X表示一个要填的数,B表示\(\max\),A表示\(+\)。题解......
  • CF915E 题解(动态开点线段树)
    题目传送门简要题意:题面就挺简要的。看到题目第一眼想到线段树,再看一眼数据范围,\(1≤n≤10^9\),寄,既然不能直接用线段树,那怎么办呢?可以离散化,为了避免麻烦的离散化,......
  • P2782 友好城市题解
    题目传送门题意:给定一些上下的线段,求出最多不相交的线段数量。一开始看错题了,以为是给定一堆线段,求出线段最大不交数量,然后就写了一个树状数组优化\(dp\)结果样例都不过,......
  • CF1785D Range = √Sum 题解
    题目传送门(第一次CF场切绿欸)题意考虑将这段序列的平均数设为\(4n\),那么总和就会是\(4n^2\),这时候就需要让最值差等于\(2n\),直接让他等于\(3n\)和\(5n\)就可......