题目链接

树剖+线段树

将区间修改转化为单点修改,因为如果按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. WordPress中默认文本编辑器替换成百度UEditor编辑器

    1.下载 下载地址: http://pan.baidu.com/s/1geNk19L 2.解压放到plugins目录下 3.插件启用

  2. 【Dubbo 源码解析】02_Dubbo SPI

    Dubbo SPI:(version:2.6.*) Dubbo 微内核 + 插件 模式,得益于 Dubbo SPI .其中 ExtentionLoader是 Dubbo SPI 最核心的类,它负责扩展 ...

  3. 易混HTML Entities与正确用法

    在页面上,表示HTML实体有多种方式,比方有"&+name;"."&#+10进制ID"."&#x+16进制ID".而 ...

  4. a,abbr,address,area,article, aside, audio标签文档

    <a>标签 download属性 <!-- 下载hello.txt --> <a href="test.txt" download="hel ...

  5. 11.17 luffycity(7)完结

    2018-11-17 15:59:01 路飞项目已经完结!后面已是flask的学习!然后还有十几天的课程等回学校再看 明天归校!!  开始全面整理自己学习的知识,整理博客!还有好多面试题!233333 ...

  6. H5选择颜色-前端颜色选择器

    开发一年多了,一直用angular2框架,框架虽然能大大减少程序员的工作量,但我还是更喜欢用原生的技术写代码. 原生的就像内功心法,框架是招式,招式虽然实用,但是想成为高手还是得有内功修养. 不多说, ...

  7. pandas 2

    ============== sdf={'rkey':[1,2,3,2],'name':['rkey1','rkey2','rkey3','rkey4']}sdf2={'lkey':[1,2,3],' ...

  8. Centos7下搭建LAMP环境,安装wordpress(不会生产博客,只是一名博客搬运工)(菜鸟)

    1.搭建MySQL数据库 安装MariaDB yum install mariadb-server -y 启动MySQL服务 emctl start mariadb #启动服务 emtcl enabl ...

  9. C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast

    关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...

  10. 016-并发编程-java.util.concurrent.locks之-Lock及ReentrantLock

    一.概述 重入锁ReentrantLock,就是支持重进入的锁 ,它表示该锁能够支持一个线程对资源的重复加锁.支持公平性与非公平性选择,默认为非公平. 以下梳理ReentrantLock.作为依赖于A ...