城市

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. Angular 表单验证类库 ngx-validator 1.0 正式发布

    背景介绍 之前写了一篇 <如何优雅的使用 Angular 表单验证>,结尾处介绍了统一验证反馈的类库  ngx-validator  ,由于这段时间一直在新模块做微前端以及相关业务组件库, ...

  2. LocalDate与Date转化

    // 01. java.util.Date --> java.time.LocalDateTimepublic void UDateToLocalDateTime() { java.util.D ...

  3. 怎样获取页面中所有带href属性的标签集合

    使用: document.links document.links instanceof HTMLCollection; 注意: 1. a 标签和 area 标签可以设置 href属性, 因此可以被获 ...

  4. vue采坑之——vue里面渲染html 并添加样式

    在工作中,有次遇到要把返回的字符串分割成两部分,一部分用另外的样式显示. 这时候,我想通过对得到字符串进行处理,在需要特别样式的字符串片段用html标签(用的span)包裹起来再通过变量绑定就好了.不 ...

  5. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  6. 微信公众号支付备忘及填坑之路-java

    一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...

  7. ubuntu14 vim编译

    (1) ./configure --prefix=/usr (2) make VIMRCLOC=/etc/vim VIMRUNTIMEDIR=/usr/share/vim/vim74 MAKE=&qu ...

  8. 【原创】编程基础之Jekins

    Jenkins 2.164.2 官方:https://jenkins.io 一 简介 Build great things at any scale The leading open source a ...

  9. ThreeJS中创建文字的几种方法

    1. DOM + CSS 传统html5的文字实现,用于添加描述性叠加文字的方法.一般使用绝对定位,并且保证z-index够大,用于显示在3D场景之上. 优点: 与CSS3D效果一致 缺点: 3d效果 ...

  10. ZPL语言完成条形码的打印

    近期因为项目的需求,需要使用到打印机来打印业务相关的条形码和其他信息,由于之前有操作其它打印机的经验,Leader就安排我来做这个了(凑哦,这能说我是懵逼的么).于是就开始了我的探索之旅啦,不对,是踩 ...