题面:https://www.lydsy.com/JudgeOnline/problem.php?id=5457

题解:

线段树合并,对于每个节点维护sum(以该节点为根的子树中最大的种类和)和kind(以该节点为根的子树中种类和最大的种类)即可。

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=(4e5)+;
int N,M,U,V,num_edge=,edge_head[maxn],root[maxn];
int num_treenode=;
struct Edge{int to,nx;}edge[maxn<<];
inline void Add_edge(int from,int to){
edge[++num_edge].nx=edge_head[from];
edge[num_edge].to=to;
edge_head[from]=num_edge;
return;
}
struct Tree{int lc,rc,l,r,sum,kd;}tr[maxn*];
inline void Pushup(int x){
int lc=tr[x].lc,rc=tr[x].rc;
if(tr[lc].sum>=tr[rc].sum){
tr[x].sum=tr[lc].sum;
tr[x].kd=tr[lc].kd;
}
else {
tr[x].sum=tr[rc].sum;
tr[x].kd=tr[rc].kd;
}
return;
}
inline void Build(int x,int l,int r,int q,int s){
tr[x].l=l;tr[x].r=r;int mid=(l+r)>>;
if(l==r&&l==q){
tr[x].kd=q;
tr[x].sum=s;
return;
}
if(q<=mid)Build(tr[x].lc=++num_treenode,l,mid,q,s);
else Build(tr[x].rc=++num_treenode,mid+,r,q,s);
Pushup(x);
return;
}
struct A_{int kd,sum;}A[maxn];
inline int Merge(int u,int v){
if(!u)return v;
if(!v)return u;
int l=tr[u].l,r=tr[u].r;
if(l==r){
tr[u].sum+=tr[v].sum;
return u;
}
tr[u].lc=Merge(tr[u].lc,tr[v].lc);
tr[u].rc=Merge(tr[u].rc,tr[v].rc);
Pushup(u);
return u;
}
inline void Dfs(int x,int fa){
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(y!=fa){
Dfs(y,x);
Merge(root[x],root[y]);
}
}
return;
}
int main(){
scanf("%d%d",&N,&M);
for(int i=;i<N;i++){
scanf("%d%d",&U,&V);
Add_edge(U,V);Add_edge(V,U);
}
for(int i=;i<=N;i++){
scanf("%d%d",&A[i].kd,&A[i].sum);
Build(root[i]=++num_treenode,,M,A[i].kd,A[i].sum);
}
Dfs(,);
for(int i=;i<=N;i++)printf("%d %d\n",tr[root[i]].kd,tr[root[i]].sum);
return ;
}

By:AlenaNuna

线段树合并 || BZOJ 5457: 城市的更多相关文章

  1. bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)

    bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...

  2. BZOJ:5457: 城市(线段树合并)(尚待优化)

    5457: 城市 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 18  Solved: 12[Submit][Status][Discuss] Des ...

  3. BZOJ #5457: 城市 [线段树合并]

    线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define re ...

  4. [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

  5. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  6. BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)

    BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...

  7. BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)

    BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...

  8. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)

    BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...

  9. BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)

    LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...

随机推荐

  1. JAVA中通过Jedis操作Redis连接与插入简单库

    一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...

  2. 【nginx&php】后台权限认证方式

    一.最常用的方法(代码中限制) 1.如何限制IP function get_new_ip(){ if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('H ...

  3. PHP访问SQL Server驱动对应关系

    引用地址: https://docs.microsoft.com/en-us/sql/connect/php/system-requirements-for-the-php-sql-driver?vi ...

  4. MySQL利用xtrabackup在线修复或新增从库

    如果数据库的数据量很大,表大小有几十个G,利用mysqldump导出备份会消耗非常长的时间,会对数据库产生不稳定风险,这时可以利用xtrabackup工具在线复制主库文件,利用复制出来的主库文件可以修 ...

  5. c语言搜索子字符串

    c字符串功能练习: 获取一行字符串,然后,在这行字符串中搜索是否包含一个小字符串 #include <cstdio> #include <cstring> #define N ...

  6. C++学习的书籍

    https://www.ossblog.org/master-c-programming-with-open-source-books/

  7. vscode + gradle 创建 java 项目 - java language server无法启动

    1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...

  8. 【转载】最强NLP预训练模型!谷歌BERT横扫11项NLP任务记录

    本文介绍了一种新的语言表征模型 BERT--来自 Transformer 的双向编码器表征.与最近的语言表征模型不同,BERT 旨在基于所有层的左.右语境来预训练深度双向表征.BERT 是首个在大批句 ...

  9. hdoj:2049

    #include <iostream> using namespace std; ]; /* n 个 数中 m个错排 转化为:充n个数中选取m个数,共有C(n,m)中,选取的m个数进行全部 ...

  10. HTTP 06 用户认证

    SSL 客户端认证具有高度的安全等级, 但是因为导入及维持费用等问题, 还未普及. 认证的方式有很多种, 多半是 基于表单的认证(即用户名/密码的方式) Session 管理及 Cookie 应用 基 ...