首页 > 其他分享 >ARC183D 做题记录

ARC183D 做题记录

时间:2024-09-02 09:04:25浏览次数:3  
标签:rt ARC183D 记录 siz ll pos vec mx

超棒的贪心构造题。

可以观察到每次操作的两个叶子,充要条件是路径上匹配边和非匹配边交替出现,操作完后全部取反。

首先考虑答案上界,从是否能取到上界入手,是本题的突破口。考虑操作两个叶子 \(x,y\),收益为 \(dep[x] + dep[y] - 2dep[\text{LCA}(x, y)]\)。若固定根 \(r\),当 \(\text{LCA}(x, y)\) 始终为 \(r\) 时取到上界。

当然 \(r\) 是不确定的,对于不同的 \(r\) 我们所述的上界会不同。有个 trick,节点两两匹配时,取 \(r\) 为重心时可以保证每次选的点都一定在 \(r\) 的不同子树中,这样 LCA 有了保证。

但是在题目限制下一定对吗?考虑目前 \(r\) 所匹配的点 \(x\),那么我们选的其中一个点一定在 \(x\) 子树中。贪心选择,我们选择另一棵子树大小最大的子树,两棵子树各选择一个叶子操作。

不难发现,一棵子树中一定可以选出一个合法的叶子。
大力发挥人类智慧,我们对一棵子树进行 DFS,每次优先遍历非匹配边,得到的 DFS 序倒过来就是合法的操作顺序。

时间复杂度 \(O(n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pir pair <ll, ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn = 3e5 + 10, mod = 998244353;
ll n, rt, bs = 1e18, siz[maxn];
vector <ll> to[maxn];
void dfs1(ll u, ll fa = 0) {
	ll mx = 0; siz[u] = 1;
	for(ll v: to[u])
		if(v ^ fa) {
			dfs1(v, u), mx = max(mx, siz[v]);
			siz[u] += siz[v];
		} mx = max(mx, n - siz[u]);
	if(mx < bs)
		bs = mx, rt = u;
}
vector <ll> vec[maxn]; ll m, pos;
void dfs2(ll u, ll fa, ll id) {
	siz[u] = 1, vec[id].pb(u);
	ll mch = u & 1? u + 1 : u - 1;
	for(ll v: to[u])
		if(v != fa && v != mch) {
			dfs2(v, u, id); siz[u] += siz[v];
		}
	if(mch ^ fa) dfs2(mch, u, id);
} set <pir> st;
ll Get(ll i) {
	ll t = vec[i][vec[i].size() - 1];
	vec[i].pop_back(); return t;
}
int main() {
	scanf("%lld", &n);
	for(ll i = 1; i < n; i++) {
		ll u, v; scanf("%lld%lld", &u, &v);
		to[u].pb(v), to[v].pb(u);
	} dfs1(1);
	for(ll v: to[rt]) {
		dfs2(v, rt, ++m);
		ll mch = rt & 1? rt + 1 : rt - 1;
		if(v == mch) pos = m;
		else st.insert(mkp((ll) vec[m].size(), m));
	}
	for(ll i = 1; i < n / 2; i++) {
		pir tmp = *st.rbegin(); st.erase(tmp);
		printf("%lld %lld\n", Get(pos), Get(tmp.se));
		st.insert(mkp((ll) vec[pos].size(), pos));
		pos = tmp.se;
	}
	printf("%lld %lld\n", rt, Get(pos));
	return 0;
}

标签:rt,ARC183D,记录,siz,ll,pos,vec,mx
From: https://www.cnblogs.com/Sktn0089/p/18392110

相关文章

  • DataX + DataXWeb 初使用过程记录
    版本:DataXv202309 DataXWeb2.1.3预发布版DataX:Github:https://github.com/alibaba/DataX 功能介绍文档:https://github.com/alibaba/DataX/blob/master/introduction.md文档上虽然只写了Linux系统,但实际部署Windows也可以JDK版本使用1.8即可Python如果环境的版本可以选......
  • 保存模型 & 记录参数
    保存的模型在你提供的代码中,模型保存的条件如下:验证阶段(_valid_epoch方法):在每个epoch结束后,模型会进行验证,即使用验证数据集(self.valid_loader)计算验证指标(valid_metric)。通过self.valid_step方法计算每个batch的验证指标,最终将这些指标的平均值保存在valid_metric......
  • 语文套卷练习记录
    目录语文套卷练习记录202412024.8.272023年9月南京零模——仅练习语文套卷练习记录202412024.8.272023年9月南京零模——仅练习【总结】整体上这张试卷难度不大,题目出的感觉有点小烂。连考了两题语言表达的特色,不知道出题人在想啥。好多答案简单的莫名其妙的,都不像真的。......
  • 记录elasticsearch-analysis-dynamic-synonym从8.7.0升级到8.15.0所遇到的问题
    记录elasticsearch-analysis-dynamic-synonym从8.7.0升级到8.15.0所遇到的问题一、问题伊始今天打算用elasticsearch最新版本来学点东西,发现安装es插件就遇到了许多问题,于是便通过此篇博客来记录问题的整个过程。去年我学习用的elasticsearch版本为8.7.0,当时GitHub有一个大佬直......
  • AtCoder Beginner Contest 369 补题记录
    A-369题意:给定A和B,求有多少个x可以和A,B构成等差数列思路:分三种情况讨论A==B则x不得不与A和B想等x位于A和B中间只有B-A为偶数才有这种情况存在x位于A和B两边可以在左边也可以在右边,只要A!=B这种情况总会存在voidsolve(){inta=read(),b=read();......
  • AtCoder Beginner Contest 369 补题记录(A~G)
    AconstintN=1000100;inta[N];signedmain(){intx,y;cin>>x>>y;if(x==y)cout<<"1\n";elseif(x%2==y%2)cout<<"3\n";elsecout<<"2\n";}BconstintN=1000100;inta[N];sign......
  • codeforces做题记录(1924B)& 回顾线段树
    1924B.SpaceHarbour题意:n个点排成一行,其中某些点上面建有港湾,港湾有一个权值,对每个点我们定义点的权值为“左边(包括自己)第一个港湾上的权值\(\times\)到右边(包括自己)第一个港湾的距离”(保证在一开始1号和n号点上都有港湾)。有q次操作:操作1给定x和v,表示在x点上建立权值为v的......
  • 【杂谈】字幕压制首次尝试记录
    字幕压制首次尝试记录使用软件字幕制作:Aegisub字幕压制:MeGUI2896+AviSynth2.6.0其中MeGUI解压即用,AviSynth需要安装,在安装中选择安装内容那步我全选了(也可能无关紧要)MeGUI如果用的是29xx的版本,很可能在添加字幕文件的时候报错Pluginwasdesignedforalaterversiono......
  • HJ19 简单错误记录 || 字符串模拟
    就是字符串模拟和处理。最大的问题就是题面题意写得真的挺模糊的,好多地方有点表意不明。。1#include<bits/stdc++.h>2usingnamespacestd;3constintmaxn=110;4chara[maxn][maxn];5intb[maxn],num_qc=0,cnt[maxn],ans[maxn],num_ans=0;6boolfg[maxn],f[ma......
  • 记录vue3写项目遇到的奇奇怪怪怪的小问题(持续更新)
    <el-table:header-cell-style="{color:'#fff',background:'rgba(78,131,211,0.8)'}"//设置table表头样式></el-table>表头居中:cell-style="{text-align:center}"表行居中<el-......