luogu p4556 [Vani有约会]雨天的尾巴 树上差分,最近公共祖先,线段树合并

命运的选择

    • 题意
    • 神一般的过程及题解.

本来有信仰用 m a p map map s e t set set跑过去的,结果调了一天都没调出来,时间还比暴力都慢.只好写线段树合并.

题意

给 一 棵 树 , 每 次 用 一 种 颜 色 覆 盖 树 上 一 条 路 径 . 求 每 一 个 点 覆 盖 次 数 最 多 的 颜 色 , 如 果 有 多 个 颜 色 取 编 号 最 小 的 那 个 . 给一棵树,每次用一种颜色覆盖树上一条路径.\newline 求每一个点覆盖次数最多的颜色,如果有多个颜色取编号最小的那个. ,.,.

神一般的过程及题解.

首先我们思考一下,如果颜色非常少,我们可以对每个颜色爆开一个数组,用树上差分裸c过去.
如果颜色数量是 1 0 5 10^5 105,可以用 1 0 5 10^5 105 m a p map map代替数组进行差分,最后对每个节点遍历一遍 m a p map map求出次数最多的颜色.
时间复杂度显然不对.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
const int yuzu=1e5;
typedef int fuko[yuzu|10];
vector<int> lj[yuzu|10];
typedef map<int,int> mii;
typedef mii yudachi[yuzu|10];
yudachi cnt,sum;
/*
cnt[i][j]表示i节点上编号为j的救济粮的个数.
sum[i][j]表示i节点上出现次数为j的救济粮中最小的编号.
本题前置技巧:树上启发式合并,树上差分,最近公共祖先.
*/namespace {
fuko sz,dep,fa,top,son;
void dfs1(int u,int f){sz[u]=1,dep[u]=dep[fa[u]=f]+1;for (int v:lj[u]) if (v^f) {dfs1(v,u),sz[u]+=sz[v];if (sz[v]>sz[son[u]]) son[u]=v;}}
void dfs2(int u,int _top) {top[u]=_top; if (son[u]) dfs2(son[u],_top);for (int v:lj[u]) if (v^fa[u]&&v^son[u]) dfs2(v,v);}
int qlca(int u,int v) {for (;top[u]^top[v];)dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];return dep[u]>dep[v]?v:u;}
}void dfs(int u) {
for (int v:lj[u]) if (v^fa[u]) {dfs(v);for (auto p:cnt[v]) cnt[u][p.first]+=p.second;}
for (auto p:cnt[u]) {if (p.second>cnt[u][sum[u][p.second]])sum[u][p.second]=p.first;}
}int main() {
int i,n,q,u,v,c;
read(n),read(q);
for (i=1;i<n;++i)u=read(),v=read(),lj[u].push_back(v),lj[v].push_back(u);
dfs1(1,0),dfs2(1,1);
for (i=1;i<=q;++i) {u=read(),v=read(),c=read();int lca=qlca(u,v);cnt[u][c]++,cnt[v][c]++;cnt[lca][c]--,cnt[fa[lca]][c]--;}
dfs(1);
for (i=1;i<=n;++i) write(sum[i].empty()?0:sum[i].rbegin()->second),pl;
}

总之不管怎么样,它T了.
在这里插入图片描述
那么接下来介绍一下线段树合并.
又是转载博客.推荐Styx神仙的博客.
线段树合并:从入门到放弃
接下来我来讲解本题使用线段树合并的做法.
首先尽你所能求出 l c a lca lca并将每一个节点 u u u对应的修改放到链表或者vector里.
添加的内容就是你差分的内容.

int u,v,op;
scanf("%d%d%d",&u,&v,&op);
int lca=qlca(u,v);  // 求lca
g.add(u,op,1),g.add(v,op,1);
g.add(lca,op,-1),g.add(fa[lca],op,-1); //lca和fa[lca]-1.

接下来建立权值线段树,并处理添加节点,合并节点,删除节点的情况.
接下来合并节点都是非常简单的事情.
然后ans[u]=id[rt[u]];.
谢谢大家.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rel register ll
#define rec register char
#define gc getchar
//#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?-1:*p1++)
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
char buf[1<<23],*p1=buf,*p2=buf;
inline int read(){int x=0,f=1;char c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return f?x:-x;}
template <typename mitsuha>
inline bool read(mitsuha &x){x=0;int f=1;char c=gc();for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';if (!~c) return 0;for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');return x=f?x:-x,1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return 0&pc(48);if (x<0) pc('-'),x=-x;int bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);return 0;}
inline char fuhao(){char c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
const int yuzu=1e5;
typedef int fuko[yuzu<<1|10];
vector<int> lj[yuzu|10];namespace tree_chain_splitting{
fuko sz,dep,fa,top,son,ans; 
void dfs1(int u,int f){sz[u]=1,dep[u]=dep[fa[u]=f]+1;for (int v:lj[u]) if (v^f) {dfs1(v,u),sz[u]+=sz[v];if (sz[v]>sz[son[u]]) son[u]=v;}}
void dfs2(int u,int _top) {top[u]=_top; if (son[u]) dfs2(son[u],_top);for (int v:lj[u]) if (v^fa[u]&&v^son[u]) dfs2(v,v);}
int qlca(int u,int v) {for (;top[u]^top[v];)dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];return dep[u]>dep[v]?v:u;}typedef int karen[yuzu<<5|13];
struct graph{
karen head,net,to,op; 
void add(int u,int v,int t) {to[++*op]=v,net[*op]=head[u],op[*op]=t,head[u]=*op;}
}g;struct segtree{
#define ls le[x],l,mid
#define rs ri[x],mid+1,r
karen le,ri,rap,gen,da,id; 
int nde() {return *rap?rap[(*rap)--]:++*gen;} // 新的节点编号,垃圾堆里能用就用,否则新开一个.
void reng(int x) {rap[++*rap]=x,le[x]=ri[x]=da[x]=id[x]=0;} // 丢掉放到垃圾堆里.
void push_up(int x) {da[x]=max(da[le[x]],da[ri[x]]);id[x]=da[le[x]]>=da[ri[x]]?id[le[x]]:id[ri[x]];}
void insert(int &x,int l,int r,int v,int p) {if (!x) x=nde();if (l==r) da[x]+=v,id[x]=l;else{int mid=l+r>>1;p<=mid?insert(ls,v,p):insert(rs,v,p);push_up(x);}if (!da[x]) id[x]=0;}
int mg(int a,int b,int l,int r) {if (!a||!b) return a|b;int net=nde(),mid=l+r>>1;if (l==r) da[net]=da[a]+da[b],id[net]=l;else {le[net]=mg(le[a],le[b],l,mid);ri[net]=mg(ri[a],ri[b],mid+1,r);push_up(net);}return reng(a),reng(b),net;}
}my_;void dfs(int u) {for (int v:lj[u]) if (v^fa[u]) dfs(v);for (int i=g.head[u];i;i=g.net[i]) my_.insert(my_.gen[u],1,yuzu,g.op[i],g.to[i]);ans[u]=my_.id[my_.gen[u]];if (fa[u]) my_.gen[fa[u]]=my_.mg(my_.gen[fa[u]],my_.gen[u],1,yuzu);}
int mian() {int i,n,m,u,v,op;read(n),read(m);for (i=1;i<n;++i) read(u),read(v),lj[u].push_back(v),lj[v].push_back(u);dfs1(1,0),dfs2(1,1);for (i=1;i<=m;++i) {u=read(),v=read(),op=read();int lca=qlca(u,v);g.add(u,op,1),g.add(v,op,1);g.add(lca,op,-1),g.add(fa[lca],op,-1);}dfs(1);for (i=1;i<=n;++i) write(ans[i]),pl;}
}int main(){
tree_chain_splitting::mian();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解数字源表

一、数字源表的基本功能 集多种功能为一体的精密测量仪器&#xff0c;主要是测量电气性能 SMU可以当电源,万用表或电源/测量组合. 当电源时&#xff1a; 可编程电压源 可编程电流源 当万用表时&#xff1a; 数字电压表(电流源,输出电流为0,测电压) 数字电流表(电压源,输…

1044 火星数字( ( ఠൠఠ )搞我心态 )【!!常看!!】

火星人是以 13 进制计数的&#xff1a; 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为&#xff1a;tam, hel, maa, huh, tou, kes, h…

机械制图之图线基础知识

1.图线的型式 1)常用基本图线: 8 种。 粗实线、细实线、细虚线、细点画线、波浪线、细双点画线、双折线、粗点画线。 2)线宽: 粗、细两种。 线宽比2:1 &#xff0c; 粗线宽度优先采用0.5 mm、0.7㎜。 不同的线型具有不同的含义。 2.图线的应用 3.图线的画法 1)同一图样中同…

机械制图哪个软件好用?浩辰CAD机械2021你值得拥有!

浩辰CAD机械 2021不仅能完美兼容主流CAD设计数据&#xff0c;还拥有业内更完备的智能专业设计功能&#xff0c;集机械制图、机构设计和数据管理等功能模块于一体。本篇机械制图CAD教程小编将详细介绍浩辰CAD机械 2021&#xff0c;帮助大家更好地了解和上手这款最新版本CAD软件。…

UML画图工具汇总

最近学习了UML&#xff0c;搜集了一把各类的画图工具以及它们的特点。最后选出我认为最好用的一款工具。 rose 《大象》书里面就是用的这款软件&#xff0c;但是这个貌似要钱&#xff0c;破解版版本很低&#xff0c;界面看起来也比较复古。不推荐。 star uml 挺有名的软件&…

超详细的热图绘制教程(5000余字),真正的保姆级教程

生物信息学习的正确姿势 NGS系列文章包括NGS基础、高颜值在线绘图和分析、转录组分析 &#xff08;Nature重磅综述|关于RNA-seq你想知道的全在这&#xff09;、ChIP-seq分析 &#xff08;ChIP-seq基本分析流程&#xff09;、单细胞测序分析 (重磅综述&#xff1a;三万字长文读懂…

机械制图-画、读组合体的视图

制图是什么&#xff1f;制图就是投影&#xff01; 依照惯例&#xff0c;雷老师上课前还是带领大家复习了上节课组合体的组合形式和物体分类的知识点&#xff0c;并且讲解了上次作业中需要注意的问题。比如对于涉及弧的问题&#xff0c;一些人没有投影线&#xff0c;一般点和特…

超好用的两款作图工具,用起来~~~

前言 作为程序员&#xff0c;项目开发过程中肯定会需要画一大堆图&#xff0c;原型图、流程图、UML图、思维导图、拓扑图等等&#xff0c;找到一个好工具肯定是能大大提高工作效率&#xff0c;这里就来分享两款我平时用得比较多的画图工具(这不是广告&#xff0c;也不是推广&a…

机械制图——常见的机件表达

文章目录 标准件与常用件1. 螺纹与螺纹紧固件螺纹旋合画法螺栓装配简化画法螺钉装配简化画法双头螺钉装配简化画法六角头螺栓连接画法双头螺柱连接画法开槽圆柱头螺钉连接画法开槽沉头螺钉连接画法 2. 键&#xff08;平键&#xff09;3. 销圆柱销圆锥销 4. 齿轮 零件图与装配图…

绘图小能手gunplot

下面的安装过程是在ubuntu20.04上进行的。 安装gnuplot需要依赖lua5.2。所以先安装lua5.2。 安装lua5.2 下载安装包 wget http://www.tecgraf.puc-rio.br/lua/ftp/lua-5.2.0.tar.gz编译安装lua5.2 解压后进入源码目录 make linux sudo make install安装gnuplot gnuplot主…

CAD机械制图入门知识

在计算机技术不断发展的过程中&#xff0c;CAD技术水平也得到了很大的提升&#xff0c;这使得CAD技术在机械制图当中的使用范围越来越大。CAD是常用的制图软件&#xff0c;具有很强的功能性&#xff0c;特别是在3D制图方面CAD有着较强的实用性。 对于大部分的人来说&#xff0c…

机械制图笔记

机械图纸上Φ50H7什么意思&#xff1f; 一般代表直径50的孔&#xff0c;H7的公差在这里是0.025mm/-0mm。 理论值M6的外径就是6毫米&#xff0c;实际上达不到&#xff0c;因为螺纹的尖顶都是圆角,通过查表m6的最大外径是5.92MM,这是基本数值。 机械制图中EQS&#xff0c;表示…

使用MapBox自定义地图

一、什么是MapBox&#xff0c;相对国内地图厂商的优势 MapBox是一家美国的地图厂商&#xff0c;2010 年成立于美国华盛顿&#xff0c;2017 年获得软银 1.64 亿美元 C 轮融资&#xff0c;完全开源的开发工具&#xff0c;帮助您在现有产品中实现灵活、轻量、稳定的地图、搜索、导…

企业网络设计,看这6个案例就够了

百度、美团的网络我们都可以称他们为企业网络。因为他们的网络本身是为自己提供服务&#xff0c;不提供网络的接入服务。 企业网主要包括三块内容&#xff1a;园区网、广域网和数据中心。按照网络用途来分&#xff0c;也可以分为办公网和生产网。 以上术语都是根据自己公司的…

雷军10周年演讲全文:没有任何成功是不冒风险的

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 2020年8月11日19:30&#xff0c;小米十周年&#xff0c;雷军公开演讲如约而至。在近3小时的演讲中&#xff0c;雷军用20个故事回顾了小米过去的热血10年&#xff0c;也展望了新的10年&#xff1a; 创新之火将会照亮每个疯…

一行代码值 200 万?雷军公开小米新 Logo 引吐槽

↓推荐关注↓ 今年是小米成立的第 10 年&#xff0c;从最初的 10 几个人创始团队&#xff0c;发展到如今的 3 万多员工。 为了迎接第十年&#xff0c;雷军透露在三年前&#xff08;2017年&#xff09;市场部同事曾建议他“升级品牌识别系统&#xff0c;先从 logo 开始。” 说干…

小米上市,雷军或成中国首富?作为科技粉也许你该关注的是这些

作者 | Leo 作为股票市场的老韭菜&#xff0c;这几天营长关注到的科技圈新闻有两个。 一个是 21 世纪经济报道的消息&#xff1a;证监会要对四大新兴行业独角兽 IPO “即报即审”&#xff0c;四个行业具体为生物科技、云计算、人工智能、高端制造。这意味着包括人工智能在内的四…

高端小米,雷军求“稳”

雷军21日在微博宣布&#xff0c;小米高端手机开始对标苹果&#xff0c;在产品品质和规格方面“向苹果学习”。 对此&#xff0c;有网友调侃&#xff1a; “对标苹果没有问题&#xff0c;但不要只对标价格。”苹果在高端手机市场中的成功&#xff0c;没有一家国产手机想要缺席。…

雷军,也卸任了……

兄弟们&#xff0c;大家中午好呀。 前几天咱们提到过&#xff0c;小米最近这段时间&#xff0c;有比较大的人事变动。 先是原来的小米集团总裁王翔在12月底退休&#xff0c;接任他的是前Redmi的负责人卢伟冰。 这才刚到1月份&#xff0c;新官上任的卢伟冰就又有新的职务了。 1月…

泪目!雷军突然卸任……

兄弟们&#xff0c;昨天下午小米的雷军&#xff0c;突然上热搜了。 这次不是因为小米又有什么新品&#xff0c;要宣传。 而是因为雷军突然卸任小米电子软件公司董事长一职。 来看看新闻的具体信息&#xff1a; 近日&#xff0c;北京小米电子软件技术有限公司发生工商变更。 雷军…