传送门

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. C# vb .net实现gamma伽玛调整特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的gamma伽玛调整特效滤镜呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: ...

  2. git便携版 添加git-bash到右键菜单

    注册表路径 HKEY_CLASSES_ROOT\Directory\Background\shell 新建项取名open in git 默认设置为右键显示的名称 Git Bash Here 新建字符串 ...

  3. UML回顾暨课程总结

    本文作为OO的最后一次博客作业,主要回顾了第四单元的架构设计和本学期的心路历程. 本单元架构设计 UML1 ​ 第一次作业的主要内容是解析mdj格式输入,记录特定数据并支持针对类.属性和方法等的查询功 ...

  4. node作为前台的项目如何打包静态js和css并生成版本号,loader插件的使用

    一.使用场景: 1.node创建的前台项目需要输入地址展示页面 2.有设置缓存或者cdn的需要在静态文件更改时能使用新的而不是缓存的,需要版本号这里 3.可能需要压缩静态文件的 二.一些参考地址,需要 ...

  5. 【JAVA】JSP+layui框架 静态表格转化成数据表格

    <table lay-filter="demo" class="layui-table" id="excTable"> < ...

  6. Java RMI学习

    网上资料: Java RMI Tutorial Dynamic code downloading using RMI RPC-维基:Remote procedure call implementing ...

  7. java数据库数据导入excel

    data导出入excel中 controller: package com.longfor.hrssc.api.controller; import com.longfor.hrssc.api.mod ...

  8. 16寸屏苹果MacBook Pro悄悄上市,售价18999 元起步

    传闻了半年之久的16寸屏苹果MacBook Pro于11月13日夜晚终于上线,15寸的机身16寸的屏幕,相比于此前的13寸和15寸MacBook Pro,新品搭配了更大的屏幕.更高性能的处理器以及更大 ...

  9. P1052 过河[DP]

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  10. LINQ查询表达式(1) - 查询表达式基础

    LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...