题目链接

树剖+线段树

将区间修改转化为单点修改,因为如果按DFS序进行修改,那么一定会对DFS序更大的点造成影响

 #include<iostream>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#define re(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
template <typename Q>
void inin(Q &ret)
{
ret=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='')f=;ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
ret=f?-ret:ret;
}
const int xxx=;
int head[xxx],Next[xxx<<],zhi[xxx<<],n,m,dui[xxx],ans[xxx];
int top[xxx],shen[xxx],fa[xxx],ed,dfn[xxx],son[xxx];
vector<int>in[xxx],out[xxx];
void add(int a,int b)
{
Next[++ed]=head[a],head[a]=ed,zhi[ed]=b;
Next[++ed]=head[b],head[b]=ed,zhi[ed]=a;
}
int dfs(int x)
{
int ret=,Max=,temp;
for(int i=head[x];i;i=Next[i])if(zhi[i]!=fa[x])
{
fa[zhi[i]]=x,shen[zhi[i]]=shen[x]+;
temp=dfs(zhi[i]);
ret+=temp;
if(Max<temp)Max=temp,son[x]=zhi[i];
}
return ret;
}
int tot;
void dfs(int x,int t)
{
if(!x)return ;
top[x]=t;dfn[x]=++tot,dui[tot]=x;
dfs(son[x],t);
for(int i=head[x];i;i=Next[i])if(zhi[i]!=fa[x]&&zhi[i]!=son[x])
dfs(zhi[i],zhi[i]);
}
void change(int x,int y,int z)
{
while(top[x]!=top[y])
if(shen[top[x]]>shen[top[y]])
in[dfn[top[x]]].push_back(z),
out[dfn[x]+].push_back(z),
x=fa[top[x]];
else in[dfn[top[y]]].push_back(z),
out[dfn[y]+].push_back(z),
y=fa[top[y]];
if(shen[x]>shen[y])swap(x,y);
in[dfn[x]].push_back(z),out[dfn[y]+].push_back(z);
}
struct tree
{
int l,r,Max,o;
}t[];
void UP(int k)
{
int p1=k<<,p2=p1|;
if(t[p1].Max>=t[p2].Max)t[k].Max=t[p1].Max,t[k].o=t[p1].o;
else t[k].Max=t[p2].Max,t[k].o=t[p2].o;
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;t[k].Max=,t[k].o=l;
if(l==r)return ;
int mid=(l+r)>>,p1=k<<,p2=p1|;
build(p1,l,mid),build(p2,mid+,r);
UP(k);
}
void update(int k,int se,int x)
{
if(t[k].l==t[k].r){t[k].Max+=x;return ;}
int mid=(t[k].l+t[k].r)>>,p1=k<<,p2=p1|;
if(se<=mid)update(p1,se,x);
else update(p2,se,x);
UP(k);
}
int main()
{
while(scanf("%d%d",&n,&m),n)
{
tot=;
ed=;memset(head,,sizeof head);
memset(son,,sizeof son);
re(i,,n)
{
int a,b;inin(a),inin(b);
add(a,b);
}
dfs();
dfs(,);int Max=;
// re(i,1,n)
// {
// printf("%d : ",i);
// cout<<"in:";re(j,0,(int)in[i].size()-1)printf("%d ",in[i][j]);cout<<"\n";
// cout<<"out:";re(j,0,(int)out[i].size()-1)printf("%d ",out[i][j]);cout<<"\n";
// }
re(i,,m)
{
int x,y,z;
inin(x),inin(y),inin(z);
change(x,y,z),Max=max(Max,z);
}
build(,,Max+);
re(i,,n)
{
re(j,,(int)in[i].size()-)
update(,in[i][j],);
re(j,,(int)out[i].size()-)
update(,out[i][j],-);
ans[dui[i]]=t[].Max?t[].o:;
}
re(i,,n)printf("%d\n",ans[i]);
re(i,,n+)in[i].clear(),out[i].clear();
}
return ;
}

hdu5029 Relief grain的更多相关文章

  1. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  2. hdu 5029 Relief grain(树链剖分+线段树)

    题目链接:hdu 5029 Relief grain 题目大意:给定一棵树,然后每次操作在uv路径上为每一个节点加入一个数w,最后输出每一个节点个数最多的那个数. 解题思路:由于是在树的路径上做操作, ...

  3. HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值

    Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  4. [HDU 5029] Relief grain

    Relief grain Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others)T ...

  5. J - Relief grain HDU - 5029

    Relief grain Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others)T ...

  6. 树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)

    题目链接 题意: 分粮食我就当成涂色了.有n个点的一棵树,在a到b的路上都涂上c颜色,颜色可重复叠加,问最后每一个点的最大颜色数量的颜色类型. 思路: 首先这题的输出是每一个点最后的情况,考虑离线做法 ...

  7. HDU 5029 Relief grain --树链剖分第一题

    题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...

  8. 2014 ICPC---Relief grain(树链剖分)

    原题链接 Problem Description The soil is cracking up because of the drought and the rabbit kingdom is fa ...

  9. hdu_5029_relief grain(树链剖分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 题意:给你一个树,然后给你两点,将这两点之间的点涂上颜色,问涂色最多的那个颜色是什么,如果数量相 ...

随机推荐

  1. Axure RP 9 Beta 开放下载(更新激活密钥和汉化包)

    2018年9月9号,7月9号来厦门入职,已经两个月了.这两个月的生活状态真心不好,一方面工作很忙(刚工作是这样?),虽然工资还可以,但总感觉性价比很低,自已对这份工作不够热爱也许.另一方面,来到新城市 ...

  2. sublime 安装ctags跳转以及跳转快捷键

    在source insight中有一个很好用的功能,就是函数的跟踪跳转,在阅读别人的代码的时候轻松的浏览原函数.我们知道,在使用vim的时候有个插件叫ctags,同理,在sublime text中也能 ...

  3. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  4. [原]Jenkins(一)---我理解的jenkins是这样的(附全套PDF下载)

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5330 ...

  5. 解决Office 2016客户端如何同SharePoint Server2016安装在一起

    前言 Microsoft Office 2016 客户端默认使用新式验证. 在某些配置中,新式验证不受安装有 SharePoint Server 2016 的 Office 2016 客户端的支持,例 ...

  6. 11.1 vue(2)

    2018-11-1 19:41:00 2018年倒数第二个月! 越努力越幸运!!!永远不要高估自己! python视频块看完了!还有30天吧就结束了! 今天老师讲的vue 主要是看官网文档 贴上连接  ...

  7. nginx_ssl安装

    Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,安装顺序为我写的顺序: c.1 SSL功能需要openssl库,下载地址:http://www.openssl. ...

  8. 移动端如何用swiper实现导航栏效果

    在移动端如何用swiper实现导航栏效果 我们在写移动端的时候会有滑动和点击导航后滑动到目标页面功能:而这个功能如果自己写的话会很麻烦,所以我在这推荐一下swiper这个插件. 其实swiper中的官 ...

  9. Python学习之旅(三十四)

    Python基础知识(33):网络编程(Ⅱ) UDP编程 相对TCP,UDP则是面向无连接的协议 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包 虽然用UDP传 ...

  10. CH 3101 - 阶乘分解 - [埃筛]

    题目链接:传送门 题解: $(1e6)!$ 这种数字,表示都表示不出来,想直接 $O(\sqrt{N})$ 分解质因数这种事情就不要想了. 考虑 $N!$ 的特殊性,这个数字的所有可能包含的质因子,就 ...