首页 > 其他分享 >2024/8/19~24总结

2024/8/19~24总结

时间:2024-08-30 21:15:19浏览次数:9  
标签:rt 24 19 void colordfn ++ 2024 int dfn

树上合并

  • 总的来说,树上合并类问题主要用于解决树上统计种类数、最大值一类的问题。

  • 最朴素的树上合并思路为分别统计每个子树的答案合并再加上父亲节点本身的答案。一般采用启发式合并,将小子树合并进大子树中

树上数颜色

  • 题意:
    给定一颗有根树,每个节点有颜色,求每棵子树的颜色种类数
  • 简要题解:
    非常经典,颜色数统计用类似莫队的桶,每到加到临界点便改变颜色数,运用类似树剖的思想,将dfn序与重儿子预处理出来启发式合并优化复杂度
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector <int> q[N];
int n,tot[N],c[N],dfn[N],colordfn,siz[N],big[N],L[N],R[N],cnt[N],ans[N],ques[N];

void add(int i)
{
	if(cnt[c[i]]==0) colordfn++;
	cnt[c[i]]++;
}

void del(int i)
{
	cnt[c[i]]--;
	if(cnt[c[i]]==0) colordfn--;
}

void dfs0(int u,int fa)//初始化dfn序和树的相关信息
{
	L[u]=++colordfn;dfn[colordfn]=u;siz[u]=1;//L->u在dfn序中的位置 dfn->dfn序
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i];
		if(v==fa) continue;
		dfs0(v,u);
		siz[u]+=siz[v];
		if(!big[u]||siz[v]>siz[big[u]]) big[u]=v;//处理重儿子
	}
	R[u]=colordfn;
}

void dfs1(int u,int fa,bool keep)
{
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i];
		if(v==big[u]||v==fa) continue;
		dfs1(v,u,0);
	}
	if(big[u])
	dfs1(big[u],u,1);
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i];
		if(v==fa||v==big[u]) continue;
		for(int i=L[v];i<=R[v];i++)
		add(dfn[i]);
	}
	add(u);
	ans[u]=colordfn;
	if(keep==0)
	for(int i=L[u];i<=R[u];i++)
	del(dfn[i]);
}
int main()
{
	cin>>n;
	for(int i=1,u,v;i<n;i++)
	{
		cin>>u>>v;
		q[u].push_back(v),tot[u]++;
		q[v].push_back(u),tot[v]++;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>c[i];
	}
	dfs0(1,0);
	colordfn=0;
	dfs1(1,0,0);
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>ques[i];
		
	}
	for(int i=1;i<=m;i++) cout<<ans[ques[i]]<<endl;
	return 0;
 } 

线段树合并

  • 题意:给定一棵树,给定一段从u到v的简单路径,给这条简单路径上的所有点发放一个权值,求每个点最后拥有最多的是哪种权值
  • 题解:经典的树上区间加求种类数问题。区间操作考虑树上差分,操作为u+1,v+1,lca(u,v)-1,fa[lca(u,v)]-1。差分后求种类数要将子树的答案和这个节点自己的答案合并。直接用桶按位合并是\(O({n^2)}\) 的,于是考虑对每个结点建一颗线段树,统计答案时一层一层向上合并。
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
const int M=1e5+10;
const int LOG=20;
const int rmax=100000;
int f[M][LOG+10],dep[M],rt[M],sum[N],ls[N],rs[N],res[N],n,m,cnt,tot[M],ans[M];
vector <int> q[M];

void initlca(int u,int fa)  //初始化倍增函数f
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;i<LOG;i++) f[u][i]=f[f[u][i-1]][i-1];
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i];
		if(v==fa) continue;
		initlca(v,u);
	}
}

int lca(int a,int b)   //求lca
{
	if(dep[a]<dep[b]) swap(a,b);
	for(int i=LOG-1;i>=0;i--)
	if(dep[f[a][i]]>=dep[b]) a=f[a][i];
	if(a==b) return a;
	for(int i=LOG;i>=0;i--) if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
	return f[a][0];
}

void push_up(int id)
{
	if(sum[ls[id]]<sum[rs[id]])
	{
		sum[id]=sum[rs[id]];
		res[id]=res[rs[id]];
	}
	else
	{
		sum[id]=sum[ls[id]];
		res[id]=res[ls[id]];
	}
}

int build(int id,int l,int r,int color,int val)  //新建节点
{
	if(!id) id=++cnt;
	if(l==r) 
	{
		sum[id]+=val,res[id]=color;
		return id;
	}
	int mid=(l+r)>>1;
	if(color<=mid) ls[id]=build(ls[id],l,mid,color,val);
	else rs[id]=build(rs[id],mid+1,r,color,val);
	push_up(id);
	return id;
}

int merge(int a,int b,int l,int r)
{
	if(!a||!b) return a+b;
	if(l==r) 
	{
		sum[a]+=sum[b];
		return a;
	}
	int mid=(l+r)>>1;
	ls[a]=merge(ls[a],ls[b],l,mid);
	rs[a]=merge(rs[a],rs[b],mid+1,r);
	push_up(a);
	return a;
}

void cacl(int u)
{
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i];
		if(v==f[u][0]) continue;
		cacl(v);
		rt[u]=merge(rt[u],rt[v],1,rmax);
	}
	ans[u]=res[rt[u]];
	if(sum[rt[u]]==0) ans[u]=0;
}

int main()
{
	cin>>n>>m;
	for(int i=1,u,v;i<n;i++)
	{
		cin>>u>>v;
		q[u].push_back(v),tot[u]++;
		q[v].push_back(u),tot[v]++;
	}
	initlca(1,0);
	for(int i=1,x,y,z;i<=m;i++)
	{
		cin>>x>>y>>z;
		rt[x]=build(rt[x],1,rmax,z,1);
		rt[y]=build(rt[y],1,rmax,z,1);
		int l=lca(x,y);
		rt[l]=build(rt[l],1,rmax,z,-1);
		rt[f[l][0]]=build(rt[f[l][0]],1,rmax,z,-1);
	}
	cacl(1);
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
	return 0;
}

标签:rt,24,19,void,colordfn,++,2024,int,dfn
From: https://www.cnblogs.com/allforgod/p/18389504

相关文章

  • 24年九月份中国平安社招入职笔试:平安胜任力测评答题要求【配合题库】
    平安集团的胜任力测评答题要求主要包括以下几点:1.**测评时间**:胜任力测评通常需要在限定时间内完成,例如,有的测评共104题,预计答题时间为25分钟。2.**题型**:胜任力测评的题型通常是多选题,要求从多个选项中选择最符合自己情况的选项。3.**答题规则**:答题过程中,可以选择最符......
  • TPAMI 2024 | 离散且平衡的谱聚类算法:一种可扩展的方法
    DiscreteandBalancedSpectralClusteringWithScalability离散且平衡的谱聚类算法:一种可扩展的方法RongWang,HuiminChen,YihangLu,QianrongZhang,FeipingNie,andXuelongLi摘要谱聚类(SC)因其卓越的聚类性能而成为深入研究的主要课题。尽管取得了成功......
  • TPAMI 2024 | 自适应区域特定损失:提高医学图像分割性能
    题目:AdaptiveRegion-SpecificLossforImprovedMedicalImageSegmentation自适应区域特定损失:提高医学图像分割性能作者:YizhengChen;LequanYu;Jen-YeuWang;NeilPanjwani;Jean-PierreObeid;WuLiu;LianliLiu;NataliyaKovalchuk摘要定义损失函数是神经......
  • 工作随意总结20240830
    最近被裁换工作了,面试过了一个测开岗位,正好趁着入职前的空闲时间,总结一下过去工作中的经历,想到哪写到哪吧,定期总结很重要。工作主要在一家ToB云服务厂商从事测试工作,工作内容主要涵盖了功能、自动化、渗透、性能等方方面面,覆盖到面很广,单一某方面来说深度上就有一些欠缺......
  • Windows10使用MSYS2和VS2019编译FFmpeg详解
    1环境准备1.1 安装VisualStudio2019这个步骤相对比较简单,不再详细说明。1.2安装msys2首先需要安装msys2环境以及相关的编译依赖项,官方网址为:https://www.msys2.org/在官网下载好安装程序后,直接按照提示安装即可。安装好后需要将下载库的地址更换为国内源,否则下载......
  • AI学会“视听”新语言,人大北邮上海AI Lab引领多模态理解革命 | ECCV2024亮点
    你是否想过,AI是如何“理解”我们这个多彩世界的呢?最近,一项由中国人民大学高瓴GeWu-Lab、北京邮电大学、上海AILab等机构联合研究的成果,为AI的“感官”升级提供了一种新思路。这项研究被收录于即将召开的计算机视觉顶级会议ECCV2024。AI的“视听盛宴”想象一下,你正在观......
  • 2024-08-30 error [email protected]: The engine "node" is incompatible with this m
    删掉依赖,使用yarn重新拉取,保错如下:[email protected]:Theengine"node"isincompatiblewiththismodule.Expectedversion">=18".Got"16.19.1" 错误[email protected]:引擎“节点”与此模块不兼容。预期版本“>=18”。得到“16.19.1”意思就是yarn拉取依赖过程中......
  • CVE2024-4577 成因梳理
    CVE-2012-1823提到PHP-CGI有关的漏洞就不得不提起CVE-2012-1823该漏洞利用php-cgi将用户传入的cgi数据中的query_string部分的-后参数当做了脚本的处理参数处理攻击者可以利用-d参数修改配置项实现远程命令执行的效果也可以-i读出源码当时这个漏洞被apache修复了修复的方......
  • Versal 自适应 SoC,XCVM2502-1MSEVSVC2197、XCVM2502-1LSEVSVC2197、XCVM2502-1LLIVSVI
    Prime 系列概述VersalPrime系列是一款高度集成、多核、异构计算平台,适用于数据中心网络、存储和有线通信等多种应用。它通过在优化了连接性的设备中实现低延迟的内联加速,为这些应用提供突破性的性能。 应用:存储加速数据中心网络加速5GxHaul无源光网络通......
  • 人生核心模式的梳理思考 2024-08-30
    2024-08-30    我也是傲娇者剧本。我还有点疑惑,我并没有觉得自己比别人厉害比别人高,也是傲娇者。傲娇者核心是冷漠,冷漠的意思是自己的目标比感受更重要。这样的话我还真是。然后许老师帮梳理了我的模式逻辑。真是清晰透彻。1:我有一些目标,达不成目标我就觉得自己不够好。比......