传送门

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. mysql数据库备份之主从同步配置

    主从同步意义? 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave).因为复制是异步进行的,所以从服务 ...

  2. Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路

    这里我借鉴了网上其他大佬的观点: 一:高并发带来的挑战 原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户. 吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100 ...

  3. Part_two:Redis之发布订阅

    Redis发布订阅 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE channel [channel ...] 订 ...

  4. html 滚动条样式

    转载:https://www.cnblogs.com/yclblog/p/6806496.html /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar ...

  5. RedHat6.9下替换yum源

    因为RedHat的yum需要收费,且要注册后才能使用.因此想把Yum源更新为CentOS的.使用的RedHat版本为6.9,因此对应的CentOS版本也要为6.9 1. 检查并删除原有的yum源 rp ...

  6. C# is与 java instanceof 作用相同

    c#中 is 检查对象是否与给定类型兼容. 例如,下面的代码可以确定对象是否为 MyObject 类型的一个实例,或者对象是否为从 MyObject 派生的一个类型: if (obj is MyObj ...

  7. SpringBoot返回date日期格式化

    SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差 问题描述 在Spring Boot项目中,使用@RestController注解,返回的java对象中 ...

  8. Linux kernel buffer ring

    参考:What are the concepts of “kernel ring buffer”, “user level”, “log level”? Ring Buffer 原始问题 个人补充:r ...

  9. c#版本23个设计模式

    一.引言 对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构.所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式.这里对设计模式 ...

  10. MVC模式:action、dao、model、service、util

    这就是一个典型的MVC: action:主要是Struts2,用来做跳转,比如jsp页面提交的表单就是进入到action里面,然后action再调用service里面的逻辑,最后返回到jsp响应请求. ...