博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj5457]城市_dsu on tree
阅读量:4543 次
发布时间:2019-06-08

本文共 1780 字,大约阅读时间需要 5 分钟。

bzoj 5457 城市

题目大意

给定一棵以\(1\)为根的\(n\)个节点的有根树。

每个节点有一个民族和该民族在当前节点的人数。

\(n\)个询问,第\(i\)个询问是求以\(i\)为根的子树内,人数最多的民族是哪个,这个民族有多少人。

如果最多的民族有多个输出编号最小的。

数据范围

\(1\le n\le 4\cdot 10^5\)\(m\le n\)\(1\le a_i\le m\)\(0\le b_i\le 1000\)

题解

我们发现这个题满足一个性质,就是无修改、询问子树。

然后不难发现,这个题就是维护一个桶然后求编号最小的最大值,这东西显然可以合并啊。

好,无修改询问子树可合并,我们就考虑考虑\(dsu\ on\ tree\)

想到\(dsu\ on\ tree\)这题就切掉了啊。

只需要维护一个每棵子树维护一个桶就好了。

代码

#include 
#define N 400010 using namespace std;int to[N<<1],head[N],nxt[N<<1],tot;int st[N],a[N],b[N],size[N],son[N],ans_num[N],ans_id[N];int mx,id;char *p1,*p2,buf[100000];#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}inline void add(int x,int y) {to[++tot]=y; nxt[tot]=head[x]; head[x]=tot;}void dfs1(int p,int fa){ size[p]=1; for(int i=head[p];i;i=nxt[i]) if(to[i]!=fa) { dfs1(to[i],p); size[p]+=size[to[i]]; if(size[to[i]]>size[son[p]]) son[p]=to[i]; }}void add(int p,int fa,int val){ st[a[p]]+=val*b[p]; if(st[a[p]]==mx&&a[p]
mx) mx=st[a[p]],id=a[p]; for(int i=head[p];i;i=nxt[i]) if(to[i]!=fa) add(to[i],p,val);}void dfs2(int p,int fa,int opt){ for(int i=head[p];i;i=nxt[i]) if(to[i]!=fa&&to[i]!=son[p]) dfs2(to[i],p,0); if(son[p]) dfs2(son[p],p,1); for(int i=head[p];i;i=nxt[i]) if(to[i]!=fa&&to[i]!=son[p]) add(to[i],p,1); st[a[p]]+=b[p]; if(st[a[p]]==mx&&a[p]
mx) mx=st[a[p]],id=a[p]; ans_num[p]=mx,ans_id[p]=id; if(!opt) add(p,fa,-1),mx=id=0;}int main(){ int n=rd(),m=rd(); for(int i=1;i

小结

\(dsu\ on\ tree\)的题目都有点小明显。

而且我们发现,这鬼东西是不是和点分治有点小像。

其实有些点分治题是完全可以拿这东西跑的。

算是黑科技吧,还是很好用的。

转载于:https://www.cnblogs.com/ShuraK/p/10770565.html

你可能感兴趣的文章
Elasticsearch学习之深入聚合分析二---案例实战
查看>>
angularjs中的事件传播$emit,$broadcast,$on
查看>>
LOG4J
查看>>
Centos7 进入单用户模式,修复系统
查看>>
DataGridView列头checkbox 分类: .NET ...
查看>>
hutacm 1465错排
查看>>
.NET开源项目
查看>>
Ceph中Bufferlist的设计与使用
查看>>
左右浮动 三列布局
查看>>
mysql replication 复制的一些问题
查看>>
华为综合面被刷,写点经验,以备后用
查看>>
F-basic资源
查看>>
django的orm框架(进阶篇)
查看>>
js实现跨平台滑动加载
查看>>
win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法
查看>>
CYQ学习主要摘要
查看>>
04 shell编程之循环语句
查看>>
mysql性能优化-慢查询分析、优化索引和配置
查看>>
Dubbo和Spring Cloud微服务架构对比
查看>>
发现对各类项目有用的不同JavaScript的Web UI
查看>>