[线段树][树上差分] Jzoj P3397 雨天的尾巴

Description

深绘里一直很讨厌雨天。

灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。

虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连

根拔起,以及田地里的粮食被弄得一片狼藉。

无奈的深绘里和村民们只好等待救济粮来维生。

不过救济粮的发放方式很特别。

首先村落里的一共有n 座房屋,并形成一个树状结构。然后救济粮分m 次发放,每次选择

两个房屋(x,y),然后对于x 到y 的路径上(含x 和y) 每座房子里发放一袋z 类型的救济粮。

然后深绘里想知道,当所有的救济粮发放完毕后,每座房子里存放的最多的是哪种救济粮。

Input

第一行两个正整数n,m,含义如题目所示。

接下来n-1 行,每行两个数(a,b),表示(a,b) 间有一条边。

再接下来m 行,每行三个数(x,y,z),含义如题目所示。

Output

n 行,第i 行一个整数,表示第i 座房屋里存放的最多的是哪种救济粮,如果有多种救济粮

存放次数一样,输出编号最小的。

如果某座房屋里没有救济粮,则对应一行输出0。

Sample Input

5 3
1 2
3 1
3 4
5 4
2 3 3
1 5 2
3 3 3

Sample Output

2
3
3
2
2

Data Constraint

对于20% 的数据,1<= n,m <= 100

对于50% 的数据,1 <= n,m <= 2000

对于100% 的数据,1 <= n;m <= 100000; 1 <= a, b, x, y <= n; 1 <= z <= 10^9

 

题解

  • 考虑如果是在一条链上的话要怎么做
  • 那么我们可以在x处加一个加入z的标记,在y+1出加入一个删掉z的标记,然后用权值线段树扫一遍就好了
  • 现在拓展到一棵树上,我们可以在x和y处加入一个加上z的标记,在lca和fa[lca]处加入一个删除z的标记,那么我们每次可以把子节点的线段树合并上来
  • 然后处理标记信息,最后查询答案即可

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <vector>
 5 #define N 100010
 6 using namespace std;
 7 struct tree { int l,r,sum,v; }t[N*50];
 8 int n,m,cnt,deep[N],a[N],root[N],fa[N][18],ans[N];
 9 vector<int>e[N],p[N],q[N];
10 void pushup(int x) { if (t[t[x].r].sum>t[t[x].l].sum) t[x].sum=t[t[x].r].sum,t[x].v=t[t[x].r].v; else t[x].sum=t[t[x].l].sum,t[x].v=t[t[x].l].v; }
11 void dfs(int x,int f,int dep)
12 {
13     fa[x][0]=f,deep[x]=dep,root[x]=x,cnt++;
14     for (int i=1;i<=17;i++) fa[x][i]=fa[fa[x][i-1]][i-1];
15     for (int i=0;i<e[x].size();i++) if (e[x][i]!=f) dfs(e[x][i],x,dep+1);    
16 }
17 int LCA(int x,int y)
18 {
19     if (deep[x]<deep[y]) swap(x,y);
20     for (int i=17;i>=0;i--) if (deep[fa[x][i]]>=deep[y]) x=fa[x][i];
21     if (x==y) return x;
22     for (int i=17;i>=0;i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
23     return fa[x][0];
24 }
25 int update(int &d,int l,int r,int x,int y)
26 {
27     if (!d) d=++cnt;
28     if (l==r) { t[d].sum+=y,t[d].v=l; return 0; }
29     int mid=l+r>>1;
30     if (x<=mid) update(t[d].l,l,mid,x,y); else update(t[d].r,mid+1,r,x,y);
31     pushup(d);
32 }
33 int merge(int x,int y,int l,int r)
34 {
35     if (!x) return y;
36     if (!y) return x;
37     if (l==r) { t[x].sum+=t[y].sum,t[x].v=l; return x; }
38     int mid=l+r>>1;
39     t[x].l=merge(t[x].l,t[y].l,l,mid),t[x].r=merge(t[x].r,t[y].r,mid+1,r);
40     pushup(x); return x;
41 }
42 void dfs1(int x,int pre)
43 {
44     for (int i=0;i<e[x].size();i++) if (e[x][i]!=pre) dfs1(e[x][i],x),merge(root[x],root[e[x][i]],1,N-10);
45     for (int i=0;i<p[x].size();i++) update(root[x],1,N-10,p[x][i],1);
46     for (int i=0;i<q[x].size();i++) update(root[x],1,N-10,q[x][i],-1);
47     ans[x]=t[root[x]].v;
48 }
49 int main()
50 {
51     scanf("%d%d",&n,&m);
52     for (int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),e[x].push_back(y),e[y].push_back(x);
53     dfs(1,0,1);
54     for (int i=1,x,y,z;i<=m;i++)
55     {
56         scanf("%d%d%d",&x,&y,&z);
57         int lca=LCA(x,y);
58         p[x].push_back(z),p[y].push_back(z),q[lca].push_back(z);
59         if (fa[lca][0]) q[fa[lca][0]].push_back(z); 
60     }
61     dfs1(1,0);
62     for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
63 }

 

转载于:https://www.cnblogs.com/Comfortable/p/11176223.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02(c)多元无约束优化问题-牛顿法

此部分内容接《02(a)多元无约束优化问题》&#xff01; 第二类&#xff1a;牛顿法(Newton method) \[f({{\mathbf{x}}_{k}}\mathbf{\delta })\text{ }\approx \text{ }f({{\mathbf{x}}_{k}}){{\nabla }^{T}}f({{\mathbf{x}}_{k}})\cdot \mathbf{\delta }\frac{1}{2}{{\mathbf{\…

推荐系统浅浅的例子

对于推荐系统&#xff0c;有很多的很强大的算法。这里作为练习&#xff0c;只介绍基本的协同过滤算法&#xff08;userbased&#xff09;和FM&#xff08;通过梯度下降的角度&#xff0c;还可以通过交替优化的角度来看&#xff09;。 这里的例子是在七月算法的视频中看的&#…

TPL Dataflow .Net 数据流组件,了解一下?

回顾上文 作为单体程序&#xff0c;依赖的第三方服务虽不多&#xff0c;但是2C的程序还是有不少内容可讲&#xff1b; 作为一个常规互联网系统&#xff0c;无外乎就是接受请求、处理请求&#xff0c;输出响应。 由于业务渐渐增长&#xff0c;数据处理的过程会越来越复杂和冗长&…

推荐系统实例

协同过滤与隐语义模型 在机器学习问题中&#xff0c;我们见到的数据集通常是如下的格式&#xff1a; input target ... ... &#xff0c;一个输入向量的集合以及对应的数据集合,就是我们想要去预测的值。 对于…

【转】深入理解JavaScript闭包(closure)

文章来源&#xff1a;http://www.felixwoo.com/archives/247 最近在网上查阅了不少Javascript闭包(closure)相关的资料&#xff0c;写的大多是非常的学术和专业。对于初学者来说别说理解闭包了&#xff0c;就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Java…

从头开始建立神经网络翻译及扩展

目录翻译从头开始建立神经网络-简介导包和配置生成一个数据集实现用来展示决策边界的辅助函数Logistic Regression训练一个神经网络我们的神经网络如何进行预测学习神经网络的参数实现神经网络训练一个隐层有3个神经元的神经网络验证隐层神经元个数对神经网络的影响练习练习题解…

对比 C++ 和 Python,谈谈指针与引用

花下猫语&#xff1a;本文是学习群内 樱雨楼 小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时&#xff0c;我谈些什么&#xff1f;》&#xff0c;大受好评。本文依然是对比 C 与 Python&#xff0c;来探讨编程语言中极其重要的概念。祝大家读有所获&#xff0c;学有所…

《吴恩达深度学习》第一课第四周任意层的神经网络实现及BUG处理

目录一、实现1、吴恩达提供的工具函数sigmoidsigmoid求导relurelu求导2、实现代码导包和配置初始化参数前向运算计算损失后向运算更新参数组装模型3、问题及思考一、实现 1、吴恩达提供的工具函数 这几个函数这里只是展示一下&#xff0c;这是吴恩达写好的工具类&#xff0c;…

inverted dropout示例

目录1、前向传播2、后向传播这里是完成的吴恩达的深度学习课程作业中的一个inverted dropout的作业题&#xff0c;是一种很流行的正则化方式。这里做一个记录,重点记录了如何实现前向和后向的inverted dropout&#xff0c;都是代码片段&#xff0c;无法运行&#xff1b;完整的代…

球形坐标和Cartesian 坐标的转换 spherical coordinate

spherical coordinate 和cartesian坐标的转换&#xff0c; 个人认为在控制camera的时候最为有用&#xff0c;比如CS中的操作方式&#xff0c; 鼠标负责方向的改变&#xff0c;其恰恰就是球形坐标的改变。而camera的位置改变就是cartesian的改变&#xff0c;所以这两者的转换就必…

深度学习优化算法实现(Momentum, Adam)

目录Momentum初始化更新参数Adam初始化更新参数除了常见的梯度下降法外&#xff0c;还有几种比较通用的优化算法&#xff1b;表现都优于梯度下降法。本文只记录完成吴恩达深度学习作业时遇到的Momentum和Adam算法&#xff0c;而且只有简要的代码。具体原理请看深度学习优化算法…

【HANA系列】SAP HANA Studio出现Fetching Children...问题

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【ABAP系列】SAP HANA Studio出现"Fetching Children..."问题前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版…

朴素Bayse新闻分类实践

目录1、信息增益&#xff08;互信息&#xff09;介绍&#xff08;1&#xff09;西瓜书中的信息增益[^1]&#xff08;2&#xff09;PRML中的互信息[^2]&#xff08;3&#xff09; 其实他们是一个东西2、朴素Bayse新闻分类[^3]&#xff08;1&#xff09;常量及辅助函数&#xff0…

R树空间索引及其变种

1、R树及其变种&#xff1a;百度百科 2、R树详介&#xff1a;http://blog.csdn.net/jazywoo123/article/details/7792745 3、R树及变种小结 R树&#xff1a;叶子节点或中间节点都可能有交集。衡量指标有查询性能和更新性能&#xff0c;更新通过删除和插入实现。R树&#xff1a;…

Kaggle-泰坦尼克号

目录前言和感谢正题前言和感谢 机器学习本人还是一个新手&#xff0c;现在处在练习阶段。在网上找到了很多免费的比较老旧kaggle比赛讲解的python代码&#xff0c;在这里自己亲在体验并跟着过了一遍。在运行的过程中加入了自己的一些改动并且修改了一些存在的BUG&#xff0c;同…

hdu 六度分离 floyd

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1869 题意分析&#xff1a;比较简单的最短路算法&#xff0c;最后只需判断最远两点距离是否大于7即可。 /*六度分离Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot…

Kaggle-自行车租赁人数预测

目录前言和感谢正题前言和感谢 机器学习本人还是一个新手&#xff0c;现在处在练习阶段。在网上找到了很多免费的比较老旧kaggle比赛讲解的python代码&#xff0c;在这里自己亲在体验并跟着过了一遍。在运行的过程中加入了自己的一些改动并且修改了一些存在的BUG&#xff0c;同…

【数据仓库】OLTP系统和OLAP系统区别

OLTP&#xff1a;联机事务处理系统(OnLine Transaction Processing) OLAP&#xff1a;联机分析处理系统(OnLine Analytical Processing) 参考文档&#xff1a; 操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别转载于:https://www.cnblogs.com/badboy200800/p/11189478.htm…

吴恩达深度学习编程作业汇总

以下列表为吴恩达的深度学习课程所对应的编程作业列表&#xff0c;都直接指向了github的连接地址&#xff1b;这些作业也是我在网上购买&#xff0c;可能与官方的内容有所出入&#xff1b;同时由于有的训练集和测试集以及预训练好的参数过大&#xff0c;不便上传&#xff0c;所…

Good Numbers(HDU5447+唯一分解)

题目链接 传送门 题面 题意 首先定义对于\(k\)的好数\(u\)&#xff1a;如果\(u\leq k\)且\(u\)的所有质因子与\(k\)的质因子一样则称\(u\)对于\(k\)是一个好数。 现给你两个数\(k1,k2(1\leq k1,k2\leq 10^{24})\)&#xff0c;要你求\(k1,k2\)的好数个数&#xff0c;对于\(k1,k2…