首页 > 其他分享 >F. Timofey and Black-White Tree 2100 (树 根号分治 思维)

F. Timofey and Black-White Tree 2100 (树 根号分治 思维)

时间:2023-03-04 12:33:24浏览次数:54  
标签:min int void Tree dfs fa Black ans 根号

https://codeforces.com/problemset/problem/1790/F
题意:给定一棵树,需要将其染为全黑,初始时只有一个点为黑色,给定一个序列c,按招顺序染色,要求每次染色后给出当前任意两黑点间的距离最小值。
n<=2e5
题解:我们可以对每个点给定一个数组d[x],表示其到最近黑点的距离,我们每染色一个点,就以它为根做一个dfs,对于点u,若d[u]>d[x]+1,则更新d[u],且dfs(u),否则表明对u有一个更近点,用d[u]+d[x]+1更新ans,且当d[u]>ans时,我们直接跳出dfs,因为其必不能比ans更小。
下面我们分析时间复杂度,对于前\(\sqrt {n}\)次操作,我们假定dfs整棵树,复杂度为O(n\(\sqrt{n}\)),而\(\sqrt {n}\)次操作后,每次dfs的次数必然<\(\sqrt {n}\)次,(每次插入一个点,你想要和黑点集距离sqrt(n),需要花费sqrt(n)个点,sqrt(n)*sqrt(n)=n,故sqrt(n)次操作后花完)。故接下来的复杂度为O(n\(\sqrt{n}\)),故整体复杂度为O(n\(\sqrt{n}\))。
代码:

//#define int long long
using namespace std;
int ans=1e9;
const int N=2e5+210;
int d[N],c[N];
vector<int> g[N];
void dfs(int x,int fa){
	for(auto it:g[x]){
		if(it==fa) continue;
		d[it]=d[x]+1;
		dfs(it,x);
	}
}
void dfss(int x,int fa){
	if(d[x]>ans) return;
	for(auto it:g[x]){
		if(it==fa) continue;
		if(d[it]>d[x]+1) d[it]=min(d[it],d[x]+1),dfss(it,x);
		else{
			d[it]=min(d[it],d[x]+1);
			ans=min(d[x]+1+d[it],ans);
		}
	}
}
void solve(){
	int n,s;cin>>n>>s;
	d[s]=0;
	for(int i=1;i<n;i++) cin>>c[i];
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	ans=1e9;
	dfs(s,-1);
	for(int i=1;i<n;i++){
	//	b[c[i]]=1;
	ans=min(ans,d[c[i]]);
		d[c[i]]=0;
		dfss(c[i],-1);
		cout<<ans<<" ";
	}
	cout<<endl;
	for(int i=1;i<=n;i++) g[i].clear();
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0); 
cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
}

标签:min,int,void,Tree,dfs,fa,Black,ans,根号
From: https://www.cnblogs.com/wjhqwq/p/17178074.html

相关文章

  • Prometheus黑盒测试【blackbox-exporter】
    官方下载地址blackbox-exporter是Prometheus官方提供的一个黑盒测试的解决方案,可用于以下使用场景:TCP:端口存活检测HTTP/HTTPS:可用性检测ICMP:主机存活检测TCP:端口存活......
  • 【学习笔记】dsu on tree
    看到了就来学一下。思想借鉴了一类启发式合并的思想?由于树的分叉结构有可以二分的性质,有重儿子的信息是可以直接从子树继承,轻儿子不超过\(log\)层。于是先计算轻儿子,......
  • Kernel文档 DeviceTree——usage-model.txt
    此文介绍Linux的设备树使用模范。OpenFirmware设备树是用于描述硬件的数据结构和语言。他是一种对硬件的描述,此描述是可被操作系统读的,所以OS不需要硬编码机器的详细信......
  • B+Tree树
    实际上它就是B树的变种,以一颗最大度数(max-degree)为4(4阶)的b+tree为例:所有的元素都会出现在叶子节点,叶子节点形成一个单向链表,每一个节点都会通过一个指针指向下一个元素。......
  • 每日一道思维题——1725H - Hot Black Hot White
    题意:给定n个整数Ai,定义一种运算concat(Ai,Aj)讲AiAj拼接在一起如concat(12,34)=1234若i,j上颜色不同有运算concat(Ai,Aj)×concat(Aj,Ai)+Ai×Aj≡Zmod3思路:  代码:......
  • 记录一个mongo数据库TreeMap结构导致数据异常的BUG
    BUG:mongo入库丢失了某些字段,没报错场景:java代码调用mongo入库,一个嵌套结构体,在内部某一层嵌套增加一个对象结构,有几个常量和嵌套对象,2个Map<String,String>,1个Map<String,......
  • SPOJ Query On A Tree IV 题解
    SPOJQueryOnATreeIV题解一个边分治套线段树套堆的题目比较难写但是有不小的启发思路来源和代码都抄自[SPOJ-QTREE4]QUERYONATREEIV题解|KSKUN'sBlog简......
  • BlackBerry面向中国市场研发多款安全数字液晶仪表盘
    BlackBerry面向中国市场研发多款安全数字液晶仪表盘2023-02-1410:24·DoNewsDoNews2月14日消息,BlackBerry近日宣布,一级汽车供应商重庆矢崎仪表有限公司(以下简称:重......
  • tree数据结构处理
    importReactfrom'react';interfaceRootObject{createUserId?:any;createUserName?:any;createTime?:any;updateUserId?:any;updateUserName?:a......
  • ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
    目录建表折叠数据算法资料分享参考文章该引擎继承于MergeTree,并在数据块合并算法中添加了折叠行的逻辑。CollapsingMergeTree会异步的删除(折叠)这些除了特定列Sign有1和-1......