P4556 [Vani有约会]雨天的尾巴

每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作。

离线处理完向上合并就好了

luogu倍增lca被卡了5分.....于是用rmq维护....

常数很大,被bzoj卡了(但是我不想改了)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define ri register int
using namespace std;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 100001
#define W 5000005
int n,m,fa[N],fir[N],Log[N*],f[][N*],tp,dfn[N],cc,ans[N];//一定记住st表的大小是n*2
int u,rt[N],lc[W],rc[W],mx[W],id[W];
vector <int> g[N];
#define mid (l+r)/2
void up(int o){
mx[o]=id[o]=;
if(mx[lc[o]]>mx[o]) mx[o]=mx[lc[o]],id[o]=id[lc[o]];
if(mx[rc[o]]>mx[o]) mx[o]=mx[rc[o]],id[o]=id[rc[o]];
}
void merge(int &o,int p,int l,int r){//线段树合并
if(!o||!p){o=o+p; return;}
if(l==r){mx[o]+=mx[p]; return;}
merge(lc[o],lc[p],l,mid);
merge(rc[o],rc[p],mid+,r); up(o);
}
void ins(int &o,int l,int r,int k,int v){
if(!o)o=++u;
if(l==r){mx[o]+=v,id[o]=l; return;}
if(k<=mid) ins(lc[o],l,mid,k,v);
else ins(rc[o],mid+,r,k,v);
up(o);
}
void dfs(int x,int Fa){
fa[x]=Fa; f[][++tp]=dfn[++cc]=x; fir[x]=tp;
for(int i=;i<g[x].size();++i) if(g[x][i]!=Fa) dfs(g[x][i],x),f[][++tp]=x;
}
inline int Min(int x,int y){return fir[x]<fir[y]?x:y;}
int lca(int x,int y){
ri l=fir[x],r=fir[y]; if(l>r) swap(l,r);
ri k=Log[r-l+];
return Min(f[k][l],f[k][r-(<<k)+]);
}
int main(){
n=read(); m=read(); int u,v,w,p;
for(ri i=;i<n;++i){
u=read(),v=read();
g[u].push_back(v);
g[v].push_back(u);
}dfs(,); Log[]=-;
for(ri i=;i<=tp;++i) Log[i]=Log[i>>]+;
for(ri i=;i<=Log[tp];++i)
for(ri j=;j+(<<i)-<=tp;++j)
f[i][j]=Min(f[i-][j],f[i-][j+(<<(i-))]);
while(m--){
u=read(),v=read(),w=read(); p=lca(u,v);
ins(rt[u],,N-,w,);
ins(rt[v],,N-,w,);
ins(rt[p],,N-,w,-);
if(fa[p]) ins(rt[fa[p]],,N-,w,-);//拆成4个操作
}
for(ri i=n;i;--i)
p=dfn[i],ans[p]=id[rt[p]],merge(rt[fa[p]],rt[p],,N-);
for(ri i=;i<=n;++i) printf("%d\n",ans[i]);
return ;
}

P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)的更多相关文章

  1. 洛谷P4556 [Vani有约会]雨天的尾巴(线段树合并)

    题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...

  2. [Vani有约会]雨天的尾巴 线段树合并

    [Vani有约会]雨天的尾巴 LG传送门 线段树合并入门好题. 先别急着上线段树合并,考虑一下这题的暴力.一看就是树上差分,对于每一个节点统计每种救济粮的数量,再一遍dfs把差分的结果统计成答案.如果 ...

  3. P4556 [Vani有约会]雨天的尾巴 (线段树合并)

    P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...

  4. 洛谷 P4556 [Vani有约会]雨天的尾巴 解题报告

    P4556 [Vani有约会]雨天的尾巴 题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒 ...

  5. [题解] P4556 [Vani有约会]雨天的尾巴

    [题解] P4556 [Vani有约会]雨天的尾巴 ·题目大意 给定一棵树,有m次修改操作,每次修改 \(( x\) \(y\) \(z )\) 表示 \((x,y)\) 之间的路径上数值 \(z\) ...

  6. 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)

    传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...

  7. P4556 [Vani有约会]雨天的尾巴(线段树合并)

    传送门 一道线段树合并 首先不难看出树上差分 我们把每一次修改拆成四个,在\(u,v\)分别放上一个,在\(lca\)和\(fa[lca]\)各减去一个,那么只要统计一下子树里的总数即可 然而问题就在 ...

  8. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)

    显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...

  9. 洛咕 P4556 [Vani有约会]雨天的尾巴

    终于把考试题清完了...又复活了... 树上差分,合并用线段树合并,但是空间会炸. 某大佬:lca和fa[lca]减得时候一定已经存在这个节点了,所以放进vector里,合并完之后减掉就好了... 玄 ...

随机推荐

  1. Linux基础教程 linux awk内置变量使用介绍

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是兄弟连Linux培训 给大家介绍的awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个 ...

  2. VO(值对象) 与PO (持久对象)

    VO ,值对象 (Value Object) , PO ,持久对象 (Persisent Object),它们是由一组属性和属性的 get 和 set 方法组成.从结构上看,它们并没有什么不同的地方. ...

  3. JPA学习(五、JPA_二级缓存)

    框架学习之JPA(五) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  4. Tensorflow2.0变化

    https://baijiahao.baidu.com/s?id=1627307436158652578&wfr=spider&for=pc https://zhidao.baidu. ...

  5. Spring 4.2.2以上版本和swagger集成方案和踩过的坑

    因为公司使用的spring版本太高,在集成swagger的时候会存在一些问题,而网上的很多实例大多都是版本比较低的,为了是朋友们少才坑,我这边将集成的过程记录一下: 1. 引入spring.swagg ...

  6. C# 利用*.SQL文件自动建库建表等的类

    /// <summary> /// 自动建库建表 /// </summary> public class OperationSqlFile { SqlConnection sq ...

  7. (二)SQL -- 查询

    主要包含以下内容: 单表查询.子查询.多表查询(左连接右连接等).合并查询 单表查询: 基础查询语句: select 列名 from 表名 where 条件 group by 列名 order by ...

  8. sqli-labs(17)

    0x01简介 百度翻译了一下 基于错误的更新查询 字符型 第一次遇到这种情况 那我们先看看源代码行吧 不懂函数的百度 $result = mysql_query($sql);//返回查询的数据的一个结 ...

  9. 读取hibernate.cfg.xml文件

    new Configuration().configure().buildSessionFactory() new Configuration()默认是读取hibernate.properties 所 ...

  10. bat实践小集

    查找当前文件夹下的exe和bat文件,并存储到txt中 for /f "tokens=4 delims= " %a in ('dir ^| findstr "^.exe ...