【BZOJ5457】城市(线段树合并)
大致题意: 一棵树上每个点有颜色\(a_i\)和权值\(b_i\),求以每个点为根的子树内权值和最大的颜色及其权值和。
线段树合并
这是一道线段树合并板子题。
(关于线段树合并,可参考我的这篇博客)
考虑一开始对于每个叶节点,在线段树第\(a_i\)位插入\(b_i\)。
然后,对于每个非叶节点,在其子节点求完答案后,依次合并其子节点的线段树,再在线段树第\(a_i\)位加上\(b_i\)。
重复此过程即可求出答案。
注意当有多种颜色权值和相同时输出编号最小的颜色,一开始判错\(WA\)了好几发。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 400000
#define LN 20
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
#define mp make_pair
#define fir first
#define sec second
using namespace std;
int n,m,ee,a[N+5],b[N+5],lnk[N+5],Rt[N+5],ans1[N+5],ans2[N+5];
struct edge {int to,nxt;}e[N<<1];typedef pair<int,int> Pr;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C==E&&(clear(),0),*C++=c)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI,C=FO,E=FO+FS;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Tp I void write(Con Ty& x,Con char& y) {write(x),pc(y);}
I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
class SegmentTree//动态开点线段树
{
private:
int tot,S[N*LN+5][2];Pr Mx[N*LN+5];
I void PU(CI x)//上传信息
{
if(Mx[S[x][0]].fir^Mx[S[x][1]].fir) Mx[x]=Mx[S[x][0]].fir>Mx[S[x][1]].fir?Mx[S[x][0]]:Mx[S[x][1]];//如果权值和不同,取权值和较大的
else Mx[x]=Mx[S[x][0]].sec<Mx[S[x][1]].sec?Mx[S[x][0]]:Mx[S[x][1]];//否则,取编号较小的
}
public:
I void Merge(CI l,CI r,int& x,CI y)//线段树合并
{
if(!x||!y) return (void)(x+=y);if(l==r) return (void)(Mx[x].fir+=Mx[y].fir);
RI mid=l+r>>1;Merge(l,mid,S[x][0],S[y][0]),Merge(mid+1,r,S[x][1],S[y][1]),PU(x);
}
I void Update(CI l,CI r,int& rt,CI x,CI v)//修改
{
if(!rt&&(rt=++tot),l==r) return (void)(Mx[rt]=mp(Mx[rt].fir+v,l));
RI mid=l+r>>1;x<=mid?Update(l,mid,S[rt][0],x,v):Update(mid+1,r,S[rt][1],x,v),PU(rt);
}
I Pr Query(CI rt) {return Mx[rt];}//询问
}S;
I void dfs(CI x,CI lst)//dfs遍历树
{
RI i;for(i=lnk[x];i;i=e[i].nxt) e[i].to^lst&&(dfs(e[i].to,x),S.Merge(1,m,Rt[x],Rt[e[i].to]),0);//合并子节点的线段树
S.Update(1,m,Rt[x],a[x],b[x]);Pr t=S.Query(Rt[x]);ans1[x]=t.sec,ans2[x]=t.fir;//插入自身信息,并询问求出答案
}
int main()
{
RI i,x,y;for(F.read(n,m),i=1;i^n;++i) F.read(x,y),add(x,y),add(y,x);//读入并建边
for(i=1;i<=n;++i) F.read(a[i],b[i]);//读入数据
for(dfs(1,0),i=1;i<=n;++i) F.write(ans1[i],' '),F.write(ans2[i],'\n');//输出答案
return F.clear(),0;
}
【BZOJ5457】城市(线段树合并)的更多相关文章
- BZOJ:5457: 城市(线段树合并)(尚待优化)
5457: 城市 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Discuss] Des ...
- BZOJ #5457: 城市 [线段树合并]
线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define re ...
- 2019.01.19 bzoj5457: 城市(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
- 线段树合并 || BZOJ 5457: 城市
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=5457 题解: 线段树合并,对于每个节点维护sum(以该节点为根的子树中最大的种类和)和kin ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )
路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
[bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...
随机推荐
- Where does Oracle SQL Developer store connections? oracle SQL Developer 连接信息保存的位置,什么地方
oracle SQL Developer 连接信息保存的位置,在什么地方? 在切换登录用户后,oracle SQL Developer 连接信息不见了.只要以前的用户信息还存在,可以在路径 C:\Us ...
- MYSQL高可用集群架构-MHA架构
1 MHA简介:MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司 ...
- STL pair类型的介绍
pair标准库类型它定义在头文件utility中. 一个pair保存两个数据成员.类似容器,pair是一个用来生成特定类型的模板.当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有 ...
- celery定时器
Celery 1.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组 ...
- Wireshark 抓取USB的数据包
需要使用root权限来运行Wireshark,并利用Wireshark来嗅探USB通信数据.当然了,我们并不建议大家利用root权限来进行操作.我们可以使用Linux提供的usbmon来为我们获取和导 ...
- ROS下多雷达融合算法
有些小车车身比较长,如果是一个激光雷达,顾前不顾后,有比较大的视野盲区,这对小车导航定位避障来说都是一个问题,比如AGV小车, 所有想在小车前后各加一个雷达,那问题是ROS的建图或者定位导航都只是支持 ...
- jmeter进行接口测试--csv参数化,数据驱动-转
首先我们要有一个接口测试用例存放的地方,我们这里用EXCEL模板管理,里面包含用例编号.入参.优先级.请求方式.url等等. 1:新建一个txt文件,命名为sjqd,后缀名改为csv,右键excel格 ...
- 使用ScriptX控件实现IE浏览器分页打印功能
之前讲过js调用ie浏览器自带打印的用法,今天讲使用插件的方式.浏览器自带打印不能控制页边距.页眉页脚等选项,尤其是如果分页打印的话,无法自动将前一页标题带到本页,所以不适用多页打印的功能.使用Scr ...
- Python Turtle绘画初学编程——六芒星,浪形圈
老师上课说可以自学一下python中的绘图turtle,就自己初步学习了一下,做了两个简单的绘图——六芒星和浪形圈(其实我也不知道该叫它什么,就照样子编了个词
- 新增SAP到OA接口,OA怎么更新WSDL给PI,怎么选择PI的IP地址(备忘)
1.首先定义个class. 弄完以后可以使用http://IP地址:8088/seeyon/services/sapService?wsdl 进行导出,部署在哪个服务器就用哪个服务器的IP地址 pr ...