首页 > 其他分享 >[ABC293Ex] Optimal Path Decomposition 题解

[ABC293Ex] Optimal Path Decomposition 题解

时间:2024-09-07 15:46:43浏览次数:11  
标签:颜色 int 题解 Decomposition Optimal 节点 dp

[ABC293Ex] Optimal Path Decomposition 题解

是一道难得一遇的好题。

对于题目中的两个限制,同时满足是困难的,于是考虑常见的套路:先固定其中一个,再计算另一个

对于本题,显然 \(k\) 是有单调性的,于是考虑二分这个 \(k\),将最优性问题转化为可行性问题,dp 路径的最小长度。那么考虑 dp 状态的设计。

对于划分颜色在一条路径上的要求,我们考察每个节点颜色和自己子节点颜色的关系。设 \(dp_{i,j}\) 表示 \(i\) 节点有 \(\le j\) 个和 \(i\) 节点颜色相同的子节点时经过 \(i\) 的最多颜色路径的颜色个数的最小值,那么显然 \(j\le 2\)。那么转移的时候从子节点依次转移,合并 dp 数组计算颜色个数即可。

具体的转移方程见代码:

#include <bits/stdc++.h>
#define N 200005
#define inf 0x3f3f3f3f
using namespace std;
int n;
struct Node {
	int to, nxt;
} e[N << 1];
int head[N], cnt;
void add(int u, int v) {
	e[++cnt].to = v;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}
int dp[N][3];
int k;
void dfs(int x, int fa) {
	dp[x][0] = dp[x][1] = dp[x][2] = 1;
	for (int i = head[x]; i; i = e[i].nxt) {
		int y = e[i].to;
		if (y == fa)
			continue;
		dfs(y, x);
		int f[3] = {inf, inf, inf};
		if (dp[x][0] + dp[y][2] <= k)
			f[0] = min(f[0], max(dp[x][0], dp[y][2] + 1));
		if (dp[x][0] + dp[y][1] <= k + 1)
			f[1] = min(f[1], max(dp[x][0], dp[y][1]));
		if (dp[x][1] + dp[y][2] <= k)
			f[1] = min(f[1], max(dp[x][1], dp[y][2] + 1));
		if (dp[x][1] + dp[y][1] <= k + 1)
			f[2] = min(f[2], max(dp[x][1], dp[y][1]));
		if (dp[x][2] + dp[y][2] <= k)
			f[2] = min(f[2], max(dp[x][2], dp[y][2] + 1));
		dp[x][0] = f[0];
		dp[x][1] = min(dp[x][0], f[1]);
		dp[x][2] = min(dp[x][1], f[2]);
	}
}
int main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		add(x, y);
		add(y, x);
	}
	int l = 1, r = n, ans = 0;
	while (l <= r) {
		k = (l + r) >> 1;
		dfs(1, 0);
		if (dp[1][2] <= k)
			ans = k, r = k - 1;
		else
			l = k + 1;
	}
	cout << ans << "\n";
	return 0;
}

标签:颜色,int,题解,Decomposition,Optimal,节点,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18401786

相关文章

  • CF1991E Coloring Game 题解
    Description有一个由\(n\)个顶点和\(m\)条边组成的无向图。每个顶点可以用三种颜色之一着色:\(1\)、\(2\)或\(3\)。初始时,所有顶点都未着色。Alice和Bob正在玩一个包含\(n\)轮的游戏。在每一轮中,都会发生以下两个步骤:Alice选择两种不同的颜色。Bob选择一个未......
  • CF2009G. Yunli's Subarray Queries 题解
    G1题目要求,对于一个子区间$a_{l\siml+k-1}$,最少要进行多少次单点修改,才能使$\forall\l<i\leql+k-1,a_i=a_{i-1}+1$,其中$k$是固定的。对于这种问题,我们通常有一个trick:将$a_i$变为$a_i-i$。这样的话,我们要求的答案就变为了$k$减去变化后的$a_{l\siml+k-1}$......
  • RecyclerView 高效使用与常见问题解决
    RecyclerView是Android应用开发中最常用的UI组件之一,通常用于显示大量数据列表。尽管功能强大,但如果使用不当,会导致性能问题、数据错乱或滚动卡顿等问题。在本篇文章中,我们将探讨RecyclerView的一些常见坑点,提供解决方案,并附带代码示例。1.坑点:ViewHolder重用导致数据错乱......
  • ctfshow web红包题第二弹题解
    从今天开始记录刷题日常打开靶场平平无奇,看源代码发现如下提示get方式提交cmd参数,猜测是命令执行漏洞,先写个phpinfo();试试。有用,但报错cerror查看显示出来部分php代码,过滤了很多东西if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)) 第一个正则表达式把字母数字几乎全......
  • [ABC137F] Polynomial Construction 题解
    明明有最厉害最好想的插值做法,怎么没有人写呢。思路考虑\(n\)个点可以确定一个\(n-1\)次多项式。如何确定。令\(l_i(x)=\prod_{j\not=i}\frac{(x-x_j)}{(x_i-x_j)}\)。可以发现这个多项式在\(x=x_i\)时值为一,在\(x=x_j(j\not=i)\)时值为零。那么就有:\[F(x)=\su......
  • 洛谷 P3034 Cow Photography G/S——题解
    洛谷P3034题解传送锚点摸鱼环节[USACO11DEC]CowPhotographyG/S题面翻译题目描述今天的奶牛们特别调皮!FarmerJohn想做的只是给排成一排的奶牛拍照,但是在他拍下照片之前,奶牛们一直在移动。具体地说,FJ有\(N\)头奶牛(\(1\leqN\leq20\,000\)),每头奶牛都有一个唯一确......
  • 题解:AT_abc369_e [ABC369E] Sightseeing Tour 详细版
    题目大意给定一个NNN个点,MMM条边的无向图。其中边有边权。有......
  • MySQL 日期函数语法介绍和案例示范以及常见问题解决
    本文将以电商交易系统为例,详细讲解MySQL日期类型及其转化,常用的日期函数,以及一些解决常见问题的方案。一、MySQL日期数据类型MySQL提供了多种日期数据类型,适用于不同的使用场景。常见的日期类型包括DATE、DATETIME、TIMESTAMP、TIME和YEAR。DATE:只存储日期,不包含......
  • 题解:SP3693 KGSS - Maximum Sum
    原题传送门思路分析线段树。这道题让我们进行两种操作,分别是单点修改和区间查询,结合数据范围,很明显是一道线段树。区间里最大的\(A_i+A_j\),其实就是求区间里的最大值和次大值,我们用线段树维护最大值和次大值。建树voidbuild(intnow,inttl,inttr){ if(tl==tr){ tmax......
  • P6638 「JYLOI Round 1」常规 题解
    题目传送门前置知识可持久化线段树|前缀和&差分解法进行差分,区间查询转化成前缀和相减。先将\(\{a\}\)升序排序。设当前询问的区间为\([1,r]\),在\(\{a\}\)中找到一个最大的\(pos\)使得\(a_{pos}\ler\),则\([1,r]\)中所做常规的次数为\(\sum\limits_{i=1......