bzoj5457
城市
Input
Output
Sample Input
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的更多相关文章
- 2019.01.19 bzoj5457: 城市(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
- bzoj5457 城市
一棵树,每个点有一个民族,和一个人数,求每个子树里最多的民族及其人数,如果一样,输出编号最小的 $n \leq 500000$ sol: 卡莫队的毒瘤题,需要 dsu on tree 大概就是 dfs ...
- [bzoj5457]城市_dsu on tree
bzoj 5457 城市 题目大意 给定一棵以\(1\)为根的\(n\)个节点的有根树. 每个节点有一个民族和该民族在当前节点的人数. 有\(n\)个询问,第\(i\)个询问是求以\(i\)为根的子树 ...
- 【BZOJ5457】城市(线段树合并)
点此看题面 大致题意: 一棵树上每个点有颜色\(a_i\)和权值\(b_i\),求以每个点为根的子树内权值和最大的颜色及其权值和. 线段树合并 这是一道线段树合并板子题. (关于线段树合并,可参考我的 ...
- dsu on tree(无讲解)
CF741D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths 分析: 最多有一个字符出现奇数次 维护某个状态下深度的最大值,注意 ...
随机推荐
- vc++6.0中查看函数栈的结构
栈:一种后进先出的数据结构 比如:弹夹 函数调用的约定 传参顺序 传参媒介 如何传递返回值 平衡参数(堆栈平衡):有且只有被调方(callee)和调用方(caller)一方执行 _cdell (c ...
- golang glog
原文链接:https://blog.csdn.net/u010857876/article/details/79094942 Flush log 产生后,会暂存在内存的buffer中.只有显示的调用 ...
- 移动端APP测试概要
APP测试点总结(全面) 一.功能性测试: ——根据产品需求文档编写测试用例. ——软件设计文档编写用例. 注意:就是根据产品需求文档编写测试用例而进行测试. 二.兼容性测试: ——android版本 ...
- Codeforces 1097E. Egor and an RPG game
传送门 首先考虑怎么算 $f(n)$ (就是题目里面那个 $f(n)$) 发现可以构造一组序列大概长这样: ${1,3,2,6,5,4,10,9,8,7,15,14,13,12,11,...,n(n+ ...
- 转载:PHP扩展函数库-文件系统、进程与网络
PHP的扩展函数库十分庞大,官方的非官方的,在这里只记录一些目前比较常用的扩展,对于这一部分,也只是记录其中一些核心的函数,不是一个全面记录.对于详细的扩展函数说明,需要在使用中参考PHP的用户手册. ...
- mybatis整合spring下的的各种配置文件
1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- Java秒杀实战 (四)JMeter压测
转自:https://blog.csdn.net/qq_41305266/article/details/81071278. 一.JMeter入门 下载链接 http://jmeter.apache. ...
- Category与Extension详解
自己做笔录 用来后来回顾.. (一) Category 1.什么是category category是objective-C 2.0之后添加的语言特性,别人口中的分类.类别其实都是指category. ...
- 判断Actiivty是否已经被销毁
一般会遇到这样的情况:在一个Activity中启动一个异步任务,异步任务中需要返回值,然后被Activity使用,但是当异步任务还未结束时,按下home键,如果这个时候系统内存比较紧张,这个Activ ...
- Shell中比较判断
一.shell判断数组中是否包含某个元素:ary=(1 2 3)a=2if [[ "${ary[@]}" =~ "$a" ]] ; then echo & ...