传送门

Solution

线段树合并的入门题

lca可以在dfs的时候离线求(用并查集)

更新的点有每条链的两个端点,它们的lca和dad[lca]

为了节省空间,lca和dad[lca]的更新可以先存储下来,等搜完该点后再做

##Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 100005
#define N 100000
int n,m,z[MN],ans[MN];
struct ques{int b,nex;}q[MN<<1];
int qhr[MN],cnt=1;
struct edge{int to,nex;}e[MN<<1];
int hr[MN],en;
inline void qins(int f,int t)
{
q[++cnt]=(ques){t,qhr[f]};qhr[f]=cnt;
if(f==t) ++cnt;
else q[++cnt]=(ques){f,qhr[t]},qhr[t]=cnt;
}
inline void ins(int f,int t)
{
e[++en]=(edge){t,hr[f]};hr[f]=en;
e[++en]=(edge){f,hr[t]};hr[t]=en;
}
int fa[MN],dad[MN];
bool vis[MN];
inline int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}
#define mid ((l+r)>>1)
int ls[MN*40],rs[MN*40],rt[MN],t[MN*40],seg;
void merge(int &x,int y,int l,int r)
{
if(!x||!y){x=x+y;return;}
if(l==r){t[x]+=t[y];return;}
merge(ls[x],ls[y],l,mid);
merge(rs[x],rs[y],mid+1,r);
t[x]=max(t[ls[x]],t[rs[x]]);
}
int query(int x,int l,int r)
{
if(!x||!t[x]) return 0;
if(l==r) return l;
return t[rs[x]]>t[ls[x]]?query(rs[x],mid+1,r):query(ls[x],l,mid);
}
void update(int &x,int l,int r,int p,int v)
{
if(!x) x=++seg;
if(l==r){t[x]+=v;return;}
if(p>mid) update(rs[x],mid+1,r,p,v);
if(p<=mid) update(ls[x],l,mid,p,v);
t[x]=max(t[ls[x]],t[rs[x]]);
}
std::map<int,int> mar[MN];
void dfs(int x,int f)
{
register int i;
fa[x]=x;dad[x]=f;
for(i=hr[x];i;i=e[i].nex)if(f^e[i].to)
{
dfs(e[i].to,x);
fa[e[i].to]=x;
merge(rt[x],rt[e[i].to],1,N);
}
vis[x]=true;
for(i=qhr[x];i;i=q[i].nex)if(vis[q[i].b]==true)
{
int lca=getf(q[i].b);
mar[lca][z[i>>1]]--;mar[dad[lca]][z[i>>1]]--;
}
std::map<int,int>::iterator it;
for(it=mar[x].begin();it!=mar[x].end();++it) update(rt[x],1,N,it->first,it->second);
ans[x]=query(rt[x],1,N);
}
int main()
{
n=read(),m=read();
register int i,j,k;
for(i=1;i<n;++i) ins(read(),read());
for(i=1;i<=m;++i)
{
j=read(),k=read(),z[i]=read();
qins(j,k),update(rt[j],1,N,z[i],1),update(rt[k],1,N,z[i],1);
}
dfs(1,0);
for(i=1;i<=n;++i) printf("%d\n",ans[i]);
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[洛谷 P4556] 雨天的尾巴的更多相关文章

  1. 洛谷P4556 雨天的尾巴(线段树合并)

    洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...

  2. [洛谷P4556] 雨天的尾巴

    这道题可以用线段树合并做,网上的题解基本上都是线段树合并的. 但是为什么我就偏偏要用dsu on tree...... 题目传送门 dsu on tree的方法类似[CF1009F] Dominant ...

  3. 洛谷P4556 雨天的尾巴 线段树

    正解:线段树合并 解题报告: 传送门! 考虑对树上的每个节点开一棵权值线段树,动态开点,记录一个max(num,id)(这儿的id,define了一下,,,指的是从小到大排QAQ 然后修改操作可以考虑 ...

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

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

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

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

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

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

  7. 【洛谷P4556】 雨天的尾巴

    题面 题解 线段树合并 我们看到这道题目首先可以想到树上差分,然后\(dfs\)合并 发现题目让我们求的东西很好用线段树维护 于是可以想到线段树合并 全世界只有我写指针版动态开点线段树(大雾 如果你要 ...

  8. [洛谷P4556][BZOJ3307]雨天的尾巴-T3订正

    线段树合并+树上差分 题目链接(···) 「简单」「一般」——其实「一般」也只多一个离散化 考试时想法看>这里< 总思路:先存所有的操作,离散化,然后用树上差分解决修改,用权值线段树维护每 ...

  9. P4556 雨天的尾巴 线段树合并

    使用线段树合并,每个节点维护一棵权值线段树,下标为救济粮种类,区间维护数量最多的救济粮编号(下标).所以每个节点答案即为\(tre[rot[x]]\). 然后运用树上点的差分思想,对于分发路径\(u, ...

随机推荐

  1. Java CPU占用过高问题排查,windows和Linux

    LINUX系统: linux系统比较简单: 1.使用命令 ps -ef | grep 找出异常java进程的pid.  找出pid为 20189 2. top -H -p 20189,所有该进程的线程 ...

  2. 每周分享五个 PyCharm 使用技巧(六)

    大家好,今天我又来给大家更新 PyCharm 的使用技巧. 从今年3月24号开始一直到今天,将近四个月的时间.包括本篇,一共更新了6篇文章,每篇 5 个小技巧,总计 30 个. 这30个使用技巧,全部 ...

  3. dubbo源码阅读之自适应扩展

    自适应扩展机制 刚开始看代码,其实并不能很好地理解dubbo的自适应扩展机制的作用,我们不妨先把代码的主要逻辑过一遍,梳理一下,在了解了代码细节之后,回过头再来思考自适应扩展的作用,dubbo为什么要 ...

  4. django路由的反向解析

    什么是路由的反向解析 我们的路由都是一个匹配关系,对应一个处理的视图函数, 如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接, 也可能是后端的redrict跳转)都需要跟着 ...

  5. npm 安装 react-devtools

    由于不能科学的上网.网上看资料装上了这个插件,装的过程有点坑.记录一下,希望能帮到和我一样的新手. 1.第一步,克隆下远程仓库的东西. 桌面右键,git-bash.然后输入: git clone ht ...

  6. day33-python之多线程

    1.多线程实例 # import threading # import time # # import threading import time class MyThread(threading.T ...

  7. VsCode使用setting sync 同步自己的插件和设置等

    直接再 Vscode中安装就可以,然后: 1. 可以点看setting sync插件在vscode 这个时候可以按照提示进行设置(也可以参考下:https://www.cnblogs.com/kenz ...

  8. MySQL Hardware--RAID级别查看

    MegaCli查看RAID级别: ## 查raid卡信息(生产商.电池信息及所支持的raid级别) /usr/local/sbin/MegaCli -AdpAllInfo -aALL |grep -E ...

  9. javascript_15-undefined 和 is not defined 的区别

    undefined 和 is not defined //1 console.log(a); // is not defined //2 var a; console.log(a); //undefi ...

  10. redis实现的简单令牌桶

    这里给出的令牌桶是以redis单节点或者集群为中间件. 不过, 这里的实现比较简单, 主要提供两个函数, 一个用于消费令牌, 一个用于添加令牌. 这里, 消费令牌和添加令牌都是通过lua来保证原子性. ...