首页 > 其他分享 >省选训练赛 #17 题目 D 补题记录

省选训练赛 #17 题目 D 补题记录

时间:2025-01-06 15:36:39浏览次数:6  
标签:ch const 17 省选 ll 补题 return mod define

具有一定 Educational 意义。

题意:一张无向图,将其分解为若干组基环树森林,求至少需要分解多少组。

\(n, m\le 2000, \ \sum n, \sum m \le 2\times 10^4\)

充分利用基环树森林的性质:若为内向基环树,那么每个点的出边至多只有一条。

  • 转化:我们相当于给图中的边定向,使得所有点出边数量最大值最小。

进一步的,等价于将每条边分配给两个点中的一个,使得所有点分配到的边数最大值最小。

考虑先二分答案,然后建立二分图模型:左部点表示边,右部点表示点。

跑二分图即可,时间复杂度 \(\mathcal O(m\sqrt n \log n)\)。

  • 启示:对于一种知识结构模型,我们需要充分利用其本身的性质和特点,通过 发现 \(\to\) 知识模型 \(\to\) 性质 进行转化。
点击查看代码
#include <bits/stdc++.h>

namespace Initial {
	#define ll int
	#define ull unsigned long long
	#define fi first
	#define se second
	#define mkp make_pair
	#define pir pair <ll, ll>
	#define pb push_back
	#define i128 __int128
	using namespace std;
	const ll maxn = 1e5 + 10, inf = 2e9, mod = 998244353;
	ll power(ll a, ll b = mod - 2, ll p = mod) {
		ll s = 1;
		while(b) {
			if(b & 1) s = 1ll * s * a %p;
			a = 1ll * a * a %p, b >>= 1;
		} return s;
	}
	template <class T>
	const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }
	template <class T>
	const inline void chkmax(T &x, const T y) { x = x < y? y : x; }
	template <class T>
	const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;

namespace Read {
	char buf[1 << 22], *p1, *p2;
	// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)
	template <class T>
	const inline void rd(T &x) {
		char ch; bool neg = 0;
		while(!isdigit(ch = getchar()))
			if(ch == '-') neg = 1;
		x = ch - '0';
		while(isdigit(ch = getchar()))
			x = (x << 1) + (x << 3) + ch - '0';
		if(neg) x = -x;
	}
} using Read::rd;

ll t, n, m, a[maxn], b[maxn];
struct Graph {
	ll n, s, t, tot, head[maxn], cur[maxn];
	struct edge {ll v, w, nxt;} e[maxn];
	void ins(ll u, ll v, ll w) {
		e[++tot] = (edge) {v, w, head[u]}; head[u] = tot;
		e[++tot] = (edge) {u, 0, head[v]}; head[v] = tot;
	}
	ll dis[maxn], q[maxn], l, r;
	bool bfs() {
		for(ll i = 1; i <= n; i++) dis[i] = -1;
		q[l = r = 1] = s, dis[s] = 0;
		while(l <= r) {
			ll u = q[l++];
			for(ll i = head[u]; i; i = e[i].nxt) {
				ll v = e[i].v, w = e[i].w;
				if(w && dis[v] == -1) {
					dis[v] = dis[u] + 1;
					q[++r] = v;
				}
			}
		} return dis[t] >= 0;
	}
	ll dfs(ll u, ll flow) {
		if(u == t) return flow; ll used = 0;
		for(ll i = cur[u]; i; cur[u] = i = e[i].nxt) {
			ll v = e[i].v, w = e[i].w;
			if(w && dis[v] == dis[u] + 1) {
				ll tmp = dfs(v, min(w, flow - used));
				used += tmp, e[i].w -= tmp, e[i ^ 1].w += tmp;
				if(flow == used) break;
			}
		} return used;
	}
	ll dinic() {
		ll ret = 0;
		while(bfs()) {
			for(ll i = 1; i <= n; i++) cur[i] = head[i];
			ret += dfs(s, inf);
		} return ret;
	}
	void clr() {
		for(ll i = 1; i <= n; i++) head[i] = 0;
		tot = 1;
	}
} G;

bool check(ll mid) {
	G.clr(); G.n = G.t = n + m + 2, G.s = G.t - 1;
	for(ll i = 1; i <= n; i++) G.ins(i, G.t, mid);
	for(ll i = 1; i <= m; i++) {
		G.ins(G.s, n + i, 1);
		G.ins(i + n, a[i], 1);
		G.ins(i + n, b[i], 1);
	} return G.dinic() == m;
}

void solve() {
	rd(n), rd(m);
	for(ll i = 1; i <= m; i++) rd(a[i]), rd(b[i]);
	ll lo = 0, hi = m;
	while(lo <= hi) {
		ll mid = lo + hi >> 1;
		if(check(mid)) hi = mid - 1;
		else lo = mid + 1;
	} printf("%d\n", lo);
}

int main() {
	rd(t); while(t--) solve();
	return 0;
}

标签:ch,const,17,省选,ll,补题,return,mod,define
From: https://www.cnblogs.com/Sktn0089/p/18655450

相关文章

  • 数据治理中,常用的术语解释.17954423
    1指标是表征和评价一项或多项经营活动业务绩效的指示。指标由指标名称和指标数值两部分组成,指标名称及其涵义体现指标在质和量方面的规定性,指标数值反映指标在具体对象在特定时间、空间、条件下的数量表现。2维度维度是指数据分析中用来描述和分类数据的属性或特征。在数据分......
  • JOISC 2017 D
    神题,模拟赛考到,不会,遂题解诞生。读完题目,发现等价于给出若干\([l_i,r_i],c_i\),需要将\(c_i\)分为\(k,,c_i-k\)两部分加到\([l_i,r_i]\)亦或\([1,l_i)\cup(r_i,n]\),要求最小化最后每个位置的值的最大值。可以考虑一个调整法的思路,我们先假定全部分给\([l_i,r_i]\),得到......
  • 『省选模拟赛3』 Day10 总结
    前言你要搞清楚自己人生的剧本不是你父母的续集,不是你子女的前传,更不是你朋友的外篇。第三次考试,第二次被我咕掉了。\(68+35+100=203\),在高二没参考的情况下,\(\texttt{BZRk2}\),也还算能看。感觉这次的排名和上次是倒过来的。T1这么唐氏的DP状态有限,是可过的,居然被我直......
  • 2024-2025-1 20241317 《计算机基础与程序设计》课程总结
    学号20241317《计算机基础与程序设计》课程总结(按顺序)每周作业链接汇总第0周作业:自我介绍第一周作业:AI学习第二周作业:c语言程序设计第一章第三周作业:c语言程序设计第二章第四周作业:c语言程序设计第三章第五周作业:c语言程序设计第四章第六周作业:c语言程序设计第五章......
  • 17. 布局控件
    一、布局管理  布局(layout)的一个作用是确定界面上各种控件之间的相对位置,使控件排列起来横平竖直;另一个作用是在窗口的尺寸发生变化时,窗口上的控件的尺寸也随同窗口发生变化,以使窗口不会出现大面积的空白区域或者控件不被窗口或其他控件挡住。  之前,我们使用控件时基本上都......
  • 《8086/8088汇编语言程序设计》16~17章
    第十六章8087/80287/80387程序设计协处理器概述介绍8087、80287和80387作为80x86系列微处理器的协处理器,其主要功能是协助主处理器进行浮点运算,大幅提升计算机系统在处理复杂数学计算时的性能。阐述它们在不同时期计算机系统中的地位和应用场景。8087/80287/80387的体系......
  • CF补题 950-Div.3
    CF补题950-Div.3-20250102Dashboard-CodeforcesRound950(Div.3)-CodeforcesA:题目大意:给出一个字符串,要求重复的字母必须\(\gem\),求缺失字母总个数#include<iostream>#include<map>usingnamespacestd;map<char,int>mp;intmain(){ intT; cin>&g......
  • 20241417 《计算机基础与程序设计》课程总结
    20241417《计算机基础与程序设计》课程总结每周作业链接汇总第一周作业:链接简要内容:课程概论,工业革命与浪潮之巅,信息与信息安全,计算机系统概论,计算机安全,计算的限制,计算思维第三周作业:链接简要内容:数字分类与计数法,位置计数法,进制转换,模拟数据与数字数据,压缩与解压,数字化,信......
  • 2025多校冲刺省选模拟赛2
    2025多校冲刺省选模拟赛2\(T1\)A.aw\(10pts/20pts\)部分分\(10\sim20pts\):枚举每一种定向方案,略带卡常。点击查看代码constintp=998244353;structnode{intnxt,to;}e[200010];inthead[100010],dis[1010][1010],a[100010],b[100010],g[2][100010],c......
  • P5680 [GZOI2017] 共享单车 题解
    题目传送门前置知识最短路|最近公共祖先|虚树解法题目中所说的回收路线树即以\(k\)为根节点的最短路径树,可以使用Dijkstra构建。标记回收区域本质上是对回收区域构建虚树,然后就和luoguP2495[SDOI2011]消耗战基本一致了,根据儿子节点的投放状态进行树形D......