首页 > 其他分享 >LG5290/LOJ3052 春节十二响 题解(启发式合并)

LG5290/LOJ3052 春节十二响 题解(启发式合并)

时间:2024-02-26 09:03:04浏览次数:25  
标签:LOJ3052 pq int 题解 pop MAXN LG5290 我们 size

考虑当这个东西是一条链的时候我们该怎么做,显然 \(1\)​ 会有两个儿子,然后两个儿子分别是一条链。

所以我们可以给两个儿子的链上的所有节点分别加到两个堆里,每次取出两个堆的最大值加入到我们选择的答案中,然后把两个堆的最大值全部 pop 掉。最终的答案就是我们 pop 完一个堆之后,所有 pop 出来的元素与另一个堆中没有 pop 出来的元素之和,最终再加上 \(a_1\)。

考虑这个东西为啥是对的。假设正解与我们存在差异,设我们选择的与正解选择的第一次出现不一样时,我们选择的 \(x\),而正解选择的 \(y\)。由于我们每次必定选择最大值,所以必定有 \(a_x>a_y\)。且考虑由于我们之前的选择每次都是弹出两个(其中小的将与大的合并),所以将不会有剩余的段可以给 \(a_x\) 放入。于是我们 \(a_x\) 必定需要新开一个段,所以答案必定更劣。

然后这玩意扩展到树上正确性也是显然的,可以对树高归纳证得。

然后发现一个问题,我们需要将一个堆 pop 到空,最差情况是 \(O((\max size_u) \times size_x)\) 的(其中我们遍历到 \(x\) 且 \(x\) 是 \(u\) 的父亲),考虑这玩意能怎么优化,显然在树上的时候,我们并不关心单个子树的答案,我们只关心这个子树在我们合并完之后,他的堆长啥样。所以我们考虑启发式合并,将 size 小的合并到 size 大的里面,于是就可以在 \(O(\sum size_u)\) 的时间内做完这个了。

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

const int MAXN = 2e5 + 5;
int n, f[MAXN], a[MAXN];
priority_queue<int> pq[MAXN];
vector<int> G[MAXN];

void dfs(int x, int fa) {
	vector<int> v;
	for (auto u:G[x]) {
		if (u == fa) continue;
		dfs(u, x);
		if (pq[u].size() > pq[x].size()) swap(pq[x], pq[u]);
		while (pq[x].size() && pq[u].size()) {
			const int mx = max(pq[u].top(), pq[x].top());
			v.push_back(mx);
			pq[u].pop(); pq[x].pop();
		}
		while (v.size()) {
			pq[x].push(v.back());
			v.pop_back();
		}
	}
	pq[x].push(a[x]);
}

void work() {
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	for (int i = 2; i <= n; ++i) {
		cin >> f[i];
		G[f[i]].push_back(i);
	}
	dfs(1, 0);
	int ans = 0;
	while (pq[1].size()) ans += pq[1].top(), pq[1].pop();
	cout << ans << endl;
}

标签:LOJ3052,pq,int,题解,pop,MAXN,LG5290,我们,size
From: https://www.cnblogs.com/XiaoQuQu/p/18033574

相关文章

  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • P1975 [国家集训队] 排队 题解
    题目链接:排队水紫,\(n\)不大,树套树或者分块都能做。分块的话,最优序列分块套套值域分块最优。观察到是可差性问题维护,即权值数量维护,那我们就树状数组套权值线段树即可。由于\(n\)不大,我们可以不用回收标记,直接数组空间开大点就行。我们预处理出初始逆序对,每一次操作都是基于......
  • 2024牛客寒假算法基础集训营6 H 纷乱的红线 题解
    Question2024牛客寒假算法基础集训营6H纷乱的红线小红拿到了一个圆,以及平面上有\(n\)个点(保证没有三点共线)。现在小红将随机取\(3\)个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?Solution考虑到\(n\le1000\)可以枚举每一条线,计算这一条线和圆的交......
  • AT_abc213_d [ABC213D] Takahashi Tour 题解(图&深搜)
    传送门题意有一个\(n\)个点的无向图。从根节点\(1\)开始,按如下规则遍历整个图:如果有连接这个点的其他点没有走过,则到这个点。如果有多个点,那么按从小到大的顺序走。如果有这个点没有其他点或者连接这个点的其他点都走过了,那么:如果这个点是根节点\(1\),结束。否则回......
  • 2024牛客寒假算法基础集训营6 G 人生的起落 题解
    Question2024牛客寒假算法基础集训营6G人生的起落定义一个三元组\((x,y,z)\)是“v-三元组”当且仅当该三元组满足以下条件:\(x=z\)\(x>y\)现在需要你构造一个\(n\)个正整数组成的数组,所有元素之和恰好等于\(S\),且恰好有\(k\)个长度威\(3\)的连续子数组......
  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......
  • UVA12422 (Kengdie) Mua (II) - Expression Evaluator 题解
    题目传送门闲话蒟蒻的第一篇黑题题解!连着花了\(12\)个小时才做出来,打代码\(6\)小时,调试\(6\)小时。一开始怎么编也编不过,直到看到了tiger大神的题解才豁然开朗。思路本题主要是输出函数或运算式子的结果,最重要的就是判断优先级。tiger大神提出了表达式树法和递归......
  • Atcoder ABC 342 全题解
    闲话当我还是一个只会AB的小蒟蒻时,由于不会C又看不懂官方题解,只好看网上的题解。结果:ABC签到题不讲AB对着题意模拟即可。A有个好玩的做法,先看前两个,如果不同跟第三个比较,如果相同看后面哪个字母跟第一个不一样。C由于是将所有的$c_i$替换,所以可得同一个字母最......
  • CF1930E 2..3...4.... Wonderful! Wonderful! 题解
    DescriptionStackhasanarray$a$oflength$n$suchthat$a_i=i$forall$i$($1\leqi\leqn$).Hewillselectapositiveinteger$k$($1\leqk\leq\lfloor\frac{n-1}{2}\rfloor$)anddothefollowingoperationon$a$an......
  • [ARC155D] Avoid Coprime Game 题解
    Description非负整数\(x,y\)的最大公约数记为\(\gcd(x,y)\),规定\(\gcd(x,0)=\gcd(0,x)=x\)。黑板上写了\(N\)个整数\(A_1,A_2,...,A_N\),这\(N\)个数的最大公约数是\(1\)。Takahashi和Aoki在玩游戏,有一个变量\(G\)初值为\(0\),他们轮流进行以下操作:从黑板上选择......