BZOJ_3307_雨天的尾巴_线段树合并+树上差分
BZOJ_3307_雨天的尾巴_线段树合并
Description
N个点,形成一个树状结构。有M次发放,每次选择两个点x,y
对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成
所有发放后,每个点存放最多的是哪种物品。
Input
第一行数字N,M
接下来N-1行,每行两个数字a,b,表示a与b间有一条边
再接下来M行,每行三个数字x,y,z.如题
Output
输出有N行
每i行的数字表示第i个点存放最多的物品是哪一种,如果有
多种物品的数量一样,输出编号最小的。如果某个点没有物品
则输出0
类似天天爱跑步,树上差分,在每个点的线段树上修改,然后自下向上合并上去。
然后线段树怎么搞。。维护全局众数,需要同时维护众数是谁以及众数出现了多少次。
注意由于我们把叶子结点当作这个数出现的次数,线段树合并到底时需要加上这个数的个数。
对于无解的情况要判掉,即众数出现的次数为0,因为可能左右的众数都不为0但出现次数为0。
然后这题我迷之TLE,然后把权值离散化才卡过的???
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define maxn m
int t[N*60],n,m,head[N],to[N<<1],nxt[N<<1],cnt,tot,mx[N*60],xx[N],yy[N],zz[N];
int fa[N],top[N],son[N],siz[N],dep[N],root[N],ls[N*60],rs[N*60],ans[N],v[N];
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
void dfs1(int x,int y) {
int i; siz[x]=1; fa[x]=y; dep[x]=dep[y]+1;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y) {
dfs1(to[i],x);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
}
}
void dfs2(int x,int t) {
top[x]=t;
if(son[x]) dfs2(son[x],t);
int i;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=son[x]&&to[i]!=fa[x]) {
dfs2(to[i],to[i]);
}
}
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) swap(x,y);
y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
void pushup(int p) {
if(t[ls[p]]>=t[rs[p]]) mx[p]=mx[ls[p]],t[p]=t[ls[p]];
else mx[p]=mx[rs[p]],t[p]=t[rs[p]];
}
int merge(int l,int r,int x,int y) {
if(!x) return y;
if(!y) return x;
if(l==r) {
t[x]+=t[y]; return x;
}
int mid=(l+r)>>1;
ls[x]=merge(l,mid,ls[x],ls[y]);
rs[x]=merge(mid+1,r,rs[x],rs[y]);
pushup(x);
return x;
}
void update(int l,int r,int x,int v,int &p) {
if(!p) p=++tot;
if(l==r) {
t[p]+=v; mx[p]=l; return ;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,v,ls[p]);
else update(mid+1,r,x,v,rs[p]);
pushup(p);
}
void dfs3(int x) {
int i;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=fa[x]) {
dfs3(to[i]);
root[x]=merge(1,maxn,root[x],root[to[i]]);
}
}
if(t[root[x]]) ans[x]=v[mx[root[x]]];
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y,z;
for(i=1;i<n;i++) {
scanf("%d%d",&x,&y); add(x,y); add(y,x);
}
dfs1(1,0);
dfs2(1,1);
for(i=1;i<=m;i++) {
scanf("%d%d%d",&xx[i],&yy[i],&zz[i]);
v[i]=zz[i];
}
sort(v+1,v+m+1);
for(i=1;i<=m;i++) {
zz[i]=lower_bound(v+1,v+m+1,zz[i])-v,x=xx[i],y=yy[i];
int l=lca(x,y);
update(1,maxn,zz[i],1,root[x]);
update(1,maxn,zz[i],1,root[y]);
update(1,maxn,zz[i],-1,root[l]);
if(fa[l]) update(1,maxn,zz[i],-1,root[fa[l]]);
}
dfs3(1);
for(i=1;i<=n;i++) {
printf("%d\n",ans[i]);
}
}
/*
1<=N,M<=100000
1<=a,b,x,y<=N
1<=z<=10^9
*/
BZOJ_3307_雨天的尾巴_线段树合并+树上差分的更多相关文章
- Bzoj 3307 雨天的尾巴(线段树合并+树上差分)
C. 雨天的尾巴 题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第 ...
- 雨天的尾巴(bzoj3307)(线段树合并+树上差分)
\(N\)个点,形成一个树状结构.有\(M\)次发放,每次选择两个点\(x,y\) 对于\(x\)到\(y\)的路径上(含\(x,y\))每个点发一袋\(Z\)类型的物品.完成 所有发放后,每个点存放 ...
- [bzoj3307]雨天的尾巴_线段树合并
雨天的尾巴 bzoj-3307 题目大意:N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. ...
- P4556 [Vani有约会]雨天的尾巴 (线段树合并)
P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...
- 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). 复杂度看起来不高, ...
- P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)
P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...
- bzoj3307 雨天的尾巴 题解(线段树合并+树上差分)
Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后,每个点存放最多的是哪种物品. Input ...
- P4556 [Vani有约会]雨天的尾巴(线段树合并)
传送门 一道线段树合并 首先不难看出树上差分 我们把每一次修改拆成四个,在\(u,v\)分别放上一个,在\(lca\)和\(fa[lca]\)各减去一个,那么只要统计一下子树里的总数即可 然而问题就在 ...
- 洛谷P4556 雨天的尾巴(线段树合并)
洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...
随机推荐
- c#调用野狗云 rest api
野狗云就不多介绍了,这里主要是记录一下c#调用他们提供的rest api,把数据post到野狗云存储,直接上代码 static void Main(string[] args) { string st ...
- 解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列
本节内容 1.迭代器协议与for循环 2.三元表达式 3.解压序列 4.列表解析 5.生成器 迭代器协议与for循环 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项, ...
- Testng基本问题
Testng testng.xml suite属性说明: suite verbose="4" 命令行信息打印等级 1~5 parallel 是否多线程并发运行测试:可选值(fals ...
- javaWeb安全漏洞修复总结
1 Web安全介绍1 2 SQL注入.盲注1 2.1 SQL注入.盲注概述 1 2.2 安全风险及原因 2 2.3 AppScan扫描建议 2 2.4 应用程序解决方案 4 3 会话标识未更新7 3. ...
- 用calc()绘制手机图案解锁的九宫格样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【数据可视化之Flask】快速设计和部署Flask网站
Flask是Python应用于WEB开发的第三方开源框架,以设计简单高效著称.我也尝试过Django,相对于Flask显得更加全面同样也更加笨重,并且我也不需要它的后台管理功能,因此选择了Flask作 ...
- 前端应该了解的PWA
一.传统web 应用 当前web应用在移动时代并没有达到其在桌面设备上流行的程度,下面有张图来对比与原生应用之间的差别. 究其原因,无外乎下面不可避免的几点: 移动设备网络限制-不可忽略的加载时间 w ...
- HTML学习笔记7:图片与超链接
①图片 <img/>标签,属性有: src,图片链接,分绝对路径和相对路径 width宽度 height,高度 ②超链接 <a> 内容描述 ...
- 为什么「margin:auto」可以让块级元素水平居中?
知乎链接:http://www.zhihu.com/question/21644198 关于BFC的解释:W3CFans http://www.w3cfuns.com/thread-5595727-1 ...
- 手把手教你如何安装Pycharm——靠谱的Pycharm安装详细教程
今天小编给大家分享如何在本机上下载和安装Pycharm,具体的教程如下: 1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/downlo ...