首页 > 其他分享 >SP3912 MTREECOL - Color a tree

SP3912 MTREECOL - Color a tree

时间:2024-08-01 18:51:37浏览次数:7  
标签:SP3912 ch limits Color sum times MTREECOL int 节点

前言

NOIP 模拟考到了这题,整场比赛死磕这题,最后悲痛拿下 \(\text{0 + 30 + 0 + 0 = 30pts}\) 的高分。

Solution

题意很清楚。每一次染色操作当且仅当父亲节点染过色。每一个节点贡献的价值是点权乘上时间。求贡献和最小。

设当前权值最大的节点为 \(x\),那么如果 \(x\) 之前的节点被染过色了,\(x\) 就一定要染色。不妨将 \(x\) 与之前的节点合并成一个块。

对于每一个块,我们需要判断如何调整先后顺序来使得贡献最小。先给一个贪心结论吧:根据平均数从大到小。

如何证明?

对于两个块 \(A\) 和 \(B\),我们设它们的大小分别为 \(n\) 和 \(m\)。

  • 若将 \(A\) 排在 \(B\) 前进行操作,贡献即为 \(\sum\limits_{i=1}^{n} A_i \times i +\sum\limits_{i=1}^{m} B_i \times (i+n)\)。

  • 若将 \(B\) 排在 \(A\) 前进行操作,贡献即为 \(\sum\limits_{i=1}^{m} B_i \times i +\sum\limits_{i=1}^{n} A_i \times (i+m)\)。

相减得出:\(m\sum\limits_{i=1}^{n} A_i-n\sum\limits_{i=1}^{m} B_i\)。

当该值 \(>0\) 时,也就是如下时,\(A\) 排在 \(B\) 前进行操作贡献更小。否则反之:

\[m\sum\limits_{i=1}^{n} A_i-n\sum\limits_{i=1}^{m} B_i>0 \]

\[m\sum\limits_{i=1}^{n} A_i>n\sum\limits_{i=1}^{m} B_i \]

\[\frac{\sum\limits_{i=1}^{n} A_i}{n}>\frac{\sum\limits_{i=1}^{m} B_i}{m} \]

易发现,这便是 \(A\) 和 \(B\) 两者的平均数。

证毕。

使用并查集维护块的大小、总和以及“平均数”,使用大根堆维护当前权值最大的节点即可。时间复杂度 \(\mathcal{O}(n \log n)\)。

话说题解区为什么大部分都是 \(\mathcal{O}(n^2)\) 的啊,明明使用堆优化就可以优化到 \(\mathcal{O}(n \log n)\) 啊(

Code

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int t,n,rt,ans=0;
struct node{
	int fa,sum,siz;
	double val;
}qwq[114514];
int f[114514];
int now=0;
bool vis[114514];
priority_queue<pair<double,int> > q;
int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
signed main(){
	while(1){
	    n=read(); rt=read();
		ans=0; now=0;
		if(!n&&!rt) break;
		for(int i=1;i<=n;i++) qwq[i]=(node){0,0,0,0.0};
		for(int i=1;i<=n;i++) f[i]=i;
		for(int i=1;i<=n;i++) qwq[i].siz=1;
		for(int i=1;i<=n;i++) vis[i]=false;
		for(int i=1;i<=n;i++){
			qwq[i].sum=read();
			ans+=qwq[i].sum;
			if(i^rt) q.push(make_pair(qwq[i].sum,i));
		}
		for(int i=1;i<n;i++){
			int u,v;
			u=read(); v=read();
			qwq[v].fa=u;
		}
		while(!q.empty()){
			int x=q.top().second;
			q.pop();
			if(vis[x]) continue;
			vis[x]=true;
			int fa=find(qwq[x].fa);
			ans+=qwq[fa].siz*qwq[x].sum;
			qwq[fa].siz+=qwq[x].siz;
			qwq[fa].sum+=qwq[x].sum;
			f[x]=fa;
			if(fa!=rt) q.push(make_pair((double)((1.0*qwq[fa].sum)/(1.0*qwq[fa].siz)),fa));
		}
		printf("%lld\n",ans);
	}
	return 0;
}

标签:SP3912,ch,limits,Color,sum,times,MTREECOL,int,节点
From: https://www.cnblogs.com/HAM-qwq/p/18337265

相关文章

  • Tokitsukaze and Two Colorful Tapes
    看这篇题解就好了解释一下为什么山谷=山峰证明加强结论:对于每个环,山谷=山峰证:对于任何一种方案,这种方案下的任意一个环,我们断开某条边,他就会长成这个样子:起点和终点连起来,不难发现是山谷=山峰再假设我们已经定下了山谷和山峰的个数\(a\),那么\(2(x-y)\)的上界就是\([1,n]\)中......
  • 使用 init 和 Fore 时 Colorama 未按预期工作
    我已经安装了colorama库并用python3.12编写它。然后,我尝试使用colorama但它没有按预期工作。当然,首先我导入了init和Fore。然后我输入了init()。之后我写了print(Fore.RED+"someredtext")。它给出了这个随机的单词和字母字符串。[31msome红色文本阅......
  • 颜色选择器react-color
    配合表单使用的颜色选择器:https://www.jianshu.com/p/b7bc59146058,原文reacthooks版本的,我改成的class函数版本的。  1.安装:npminstallreact-color--save  2.封装:colorPicker.js importReact,{FC}from'react';import{SketchPicker}from'react-color'......
  • 如何在 Folium colorbar 中自定义标题文本?我想增加颜色图标题文本的字体大小
    我正在尝试在Folium中使用颜色条作为输出变量圆形图colormap=cm.LinearColormap(colors=['green','red'],index=[min(df['output']),max(df['output'])],vmin=min(df['output']),vmax=max(df['output']),caption='out......
  • D. Bicolored RBS
    原题链接题解真的是无中生有了从左到右遍历,维护两个颜色的嵌套深度(如果把左括号看成+1,右括号看成-1,那就是维护最大和)如果遇到右括号,给目前和较大的那个,如果遇到左括号,给较小的那个code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voidsolve(){......
  • D. Color with Occurrences
    链接https://codeforces.com/problemset/problem/1714/D题目思路思路1(未实现):首先判断可行性:每个子串都去匹配,然后添加差分数组,对原字符串的每个位置校验,如果每个位置都被覆盖至少一次说明可行;然后再删去最多的线段。思路2(代码中):利用动态规划,借助数组dp[N]表示前i个字符构......
  • 本地部署,Colorizer: 让黑白图像重现色彩的奇迹
    目录引言什么是Colorizer​编辑​编辑Colorizer的特点工作原理应用场景本地部署本地运行实验与结果结语Tip:引言自摄影术发明以来,黑白图像一直是记录历史和艺术创作的重要手段。然而,黑白图像虽然具备其独特的美感,但也失去了色彩信息,使观众难以全面感知图像中......
  • modifing windows color from registry
    WindowsRegistryEditorVersion5.00[HKEY_CURRENT_USER\ControlPanel\Colors]"ActiveBorder"="180180180""ActiveTitle"="153180209""AppWorkspace"="171171171""Background"="......
  • [题解]AT_abc215_g [ABC215G] Colorful Candies 2
    思路定义\(vis_i\)表示数\(i\)在序列中出现的次数。如果我们选出\(k\)个数,答案就是(其中\(m\)表示\(\max(c_i)\)):\[\sum_{i=1}^m\frac{\binom{n}{x}-\binom{n-vis_i}{k}}{\binom{n}{x}}\]显然,我们只枚举序列中存在的元素,时间复杂度\(\Theta(n^2)\),过不......
  • Win11系统提示找不到coloradapterclient.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个coloradapterclient.dll文件(挑选合适的版本......