城市

HYSBZ - 5457

有n座城市,m个民族。这些城市之间由n-1条道路连接形成了以城市1为根的有根树。每个城市都是某一民族的聚居
地,Master知道第i个城市的民族是A_i,人数是B_i。为了维护稳定,Master需要知道某个区域内人数最多的民族
。他向你提出n个询问,其中第i个询问是:求以i为根的子树内,人数最多的民族有是哪个,这个民族有多少人。
如果子树内人数最多的民族有多个,输出其中编号最小的民族。
 
 

Input

共有2*n行。
第一行有两个整数n, m。
接下来n-1行,每行有两个整数u, v,表示一条连接u和v的道路。
接下来n行,第i行有两个整数A_i, B_i。
n<=400000,m<=n,1<=A_i<=m,0<=B_i<=1000。
 
 

Output

共有n行。
第i行两个整数x, y,分别表示以i为根的子树中人数最多的民族和它的人数。
 
 

Sample Input

8 6 1 2 1 3 2 4 4 5 3 6 5 7 1 8 2 8 2 5 1 1 3 1 6 7 5 6 1 10 4 6

Sample Output

2 13 1 10 5 6 1 10 1 10 5 6 1 10 4 6

sol:非常模板的线段树合并

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
#define Mp make_pair
#define pii pair<int,int>
int n,m,A[N],B[N];
int rt[N],cnt=;
vector<int>E[N];
pii Ans[N];
inline void Link(int x,int y){E[x].push_back(y); E[y].push_back(x);}
struct Node
{
int ls,rs;
pii mx;
}T[N*];
inline pii pmax(pii a,pii b)
{
return ((a.first>b.first)||(a.first==b.first&&a.second<b.second))?a:b;
}
inline void PushUp(int x)
{
T[x].mx=pmax(T[T[x].ls].mx,T[T[x].rs].mx);
}
inline void Insert(int &x,int l,int r,int id,int num)
{
if(!x) x=++cnt;
if(l==r) {T[x].mx=Mp(num,id); return;}
int mid=(l+r)>>;
if(id<=mid) Insert(T[x].ls,l,mid,id,num);
else Insert(T[x].rs,mid+,r,id,num);
PushUp(x);
}
inline int Merg(int x,int y,int l,int r)
{
if(x*y==) return x+y;
if(l==r) {T[x].mx.first+=T[y].mx.first; return x;}
int mid=(l+r)>>;
T[x].ls=Merg(T[x].ls,T[y].ls,l,mid);
T[x].rs=Merg(T[x].rs,T[y].rs,mid+,r);
PushUp(x);
return x;
}
inline void dfs(int x,int fa)
{
int i;
for(i=;i<E[x].size();i++)
{
int to=E[x][i]; if(to==fa) continue;
dfs(to,x); rt[x]=Merg(rt[x],rt[to],,m);
}
Ans[x]=T[rt[x]].mx;
}
int main()
{
// freopen("5457.in","r",stdin);
int i,x,y;
R(n); R(m);
for(i=;i<n;i++)
{
R(x); R(y); Link(x,y);
}
for(i=;i<=n;i++)
{
R(A[i]); R(B[i]); Insert(rt[i],,m,A[i],B[i]);
}
dfs(,);
for(i=;i<=n;i++) W(Ans[i].second),Wl(Ans[i].first);
return ;
}
/*
input
8 6
1 2
1 3
2 4
4 5
3 6
5 7
1 8
2 8
2 5
1 1
3 1
6 7
5 6
1 10
4 6
output
2 13
1 10
5 6
1 10
1 10
5 6
1 10
4 6
*/

bzoj5457的更多相关文章

  1. 2019.01.19 bzoj5457: 城市(线段树合并)

    传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi​个aia_iai​民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...

  2. bzoj5457 城市

    一棵树,每个点有一个民族,和一个人数,求每个子树里最多的民族及其人数,如果一样,输出编号最小的 $n \leq 500000$ sol: 卡莫队的毒瘤题,需要 dsu on tree 大概就是 dfs ...

  3. [bzoj5457]城市_dsu on tree

    bzoj 5457 城市 题目大意 给定一棵以\(1\)为根的\(n\)个节点的有根树. 每个节点有一个民族和该民族在当前节点的人数. 有\(n\)个询问,第\(i\)个询问是求以\(i\)为根的子树 ...

  4. 【BZOJ5457】城市(线段树合并)

    点此看题面 大致题意: 一棵树上每个点有颜色\(a_i\)和权值\(b_i\),求以每个点为根的子树内权值和最大的颜色及其权值和. 线段树合并 这是一道线段树合并板子题. (关于线段树合并,可参考我的 ...

  5. dsu on tree(无讲解)

    CF741D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths 分析: 最多有一个字符出现奇数次 维护某个状态下深度的最大值,注意 ...

随机推荐

  1. Django学习(2.2.1版本)

    项目技术重难点分析: 模型层:模型是您的数据唯一而且准确的信息来源.它包含您正在储存的数据的重要字段和行为.一般来说,每一个模型都映射一个数据库表. 每各模型都是一个python的类,这些类继承  d ...

  2. Java 字符串比较

    1.字符串比较 compareTo() 方法用于两种方式的比较: 字符串与对象进行比较. 按字典顺序比较两个字符串. 返回值 返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符 ...

  3. Api文档生成工具与Api文档的传播(pdf)

    点击查看apidoc生成文档demo 1 环境和工具 win10 apidoc:注释生成api文档 wkhtmltopdf:apidoc生成的是html,不适合传播,于是通过wkhtmltopdf将h ...

  4. iview-admin部署linux nginx报500错误的问题记录

    遇到个新服务器部署iview-admin之后 在nginx配置文件有个user配置项 这里需要配置为root或者可以读取本地文件的用户 站点配置如下 server { listen ; server_ ...

  5. Java基础第一天--继承、修饰符

    继承 继承的概述: 继承是面向对象三大特征之一.可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法. //创建父类 public class Fu{ public void sh ...

  6. RobHess的SIFT代码解析之kd树

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码:SIFT+KD ...

  7. httpd安装mod_jk模块

    1.1 使用yum安装的httpd安装mod_jk模块 mod_jk模块下载地址官网 安装httpd和httpd-devel(这个包会有apxs必须要有的) [root@apache ~]# yum ...

  8. CentOS下安装好python和opencv,却import cv2失败

    在安装好CentOS和OpenCV后,在终端输入python,在输入import cv2.却报错:ImportError:Mo module named cv2.浏览Python下文件夹发现cv2.s ...

  9. ConcurrentDictionary源码概读

    ConcurrentDictionary的数据结构主要由Tables和Node组成,其中Tables包括桶(Node,节点)数组.局部锁(Local lock).每个锁保护的元素数量(PerLock) ...

  10. QQ气泡效果剖析

    对于QQ汽泡效果我想不用多说了,都非常的熟悉,而且当时这效果出来简直亮瞎眼了,挺炫的,这里再来感受下: 而这次只实现单个汽泡的效果,并不涉及到加入Listview上的处理,一步步来,先上一下最终这次要 ...