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. opencv加椒盐噪声

    void salt(IplImage *img, int saltNum) { int x,y; int i ; unsigned char *src = NULL; src = (unsigned ...

  2. BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集

    Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...

  3. BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算

    Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ...

  4. sh_11_九九乘法表

    sh_11_九九乘法表 # 1. 打印 9 行小星星 row = 1 while row <= 9: col = 1 while col <= row: # print("*&q ...

  5. CentOS7/RHEL7 pacemaker+corosync高可用集群搭建

     TOC \o "1-3" \h \z \u 一.集群信息... PAGEREF _Toc502099174 \h 4 08D0C9EA79F9BACE118C8200AA004B ...

  6. Chrome 抓包:快速定位HTTP协议问题

    标签(空格分隔): 快速定位HTTP协议问题 Chrome:快速定位HTTP协议问题 快捷键:control+shift+i(windows),command+option+i(mac) 控制器: 控 ...

  7. python连接字符串的几种方法--转子(香草拿铁的园子)

    一. str1+str2 string类型 ‘+’号连接 >>> str1="Good" >>> str2="Luck" & ...

  8. linux C 加载so文件 指定路径

    在Linux C中动态加载.so文件用dlopen("libdemo.so", RTLD_NOW); 但是默认的so搜索目录不包括当前程序目录,所以必须复制到系统的so目录 才能运 ...

  9. (C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL里面提供的函数的时候,总是被生成正确的C函数在C#中的正确声明而困扰,而生成C++中结构体在C#中的声明 - 天,没 ...

  10. Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu、TMenuItem、TMenuBar、TMainMenu

    Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu.TMenuItem.TMenuBar.TMainMenu 相关控件: TMenuBar.TPopup ...