hdu5029 Relief grain
树剖+线段树
将区间修改转化为单点修改,因为如果按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的更多相关文章
- 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 ...
- hdu 5029 Relief grain(树链剖分+线段树)
题目链接:hdu 5029 Relief grain 题目大意:给定一棵树,然后每次操作在uv路径上为每一个节点加入一个数w,最后输出每一个节点个数最多的那个数. 解题思路:由于是在树的路径上做操作, ...
- HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值
Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- [HDU 5029] Relief grain
Relief grain Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others)T ...
- J - Relief grain HDU - 5029
Relief grain Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others)T ...
- 树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)
题目链接 题意: 分粮食我就当成涂色了.有n个点的一棵树,在a到b的路上都涂上c颜色,颜色可重复叠加,问最后每一个点的最大颜色数量的颜色类型. 思路: 首先这题的输出是每一个点最后的情况,考虑离线做法 ...
- HDU 5029 Relief grain --树链剖分第一题
题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...
- 2014 ICPC---Relief grain(树链剖分)
原题链接 Problem Description The soil is cracking up because of the drought and the rabbit kingdom is fa ...
- hdu_5029_relief grain(树链剖分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 题意:给你一个树,然后给你两点,将这两点之间的点涂上颜色,问涂色最多的那个颜色是什么,如果数量相 ...
随机推荐
- 蜕变成蝶~Linux设备驱动之DMA
如果不曾相逢 也许 心绪永远不会沉重 如果真的失之交臂 恐怕一生也不得轻松 一个眼神 便足以让心海 掠过飓风 在贫瘠的土地上 更深地懂得风景 一次远行 便足以憔悴了一颗 羸弱的心 每望一眼秋水微澜 便 ...
- 深入理解String类详解
1.Stringstr = "eee" 和String str = new String("eee")的区别 先看一小段代码, 1 public static ...
- CentOS安装和配置Mysql
1. Centos 默认的yum 是没有Mysql5.7 所以需要配置下,从官网获取最新的RPM包 在MySQL官网中下载YUM源rpm安装包:https://dev.mysql.com/downlo ...
- error MSB3073: 命令“copy /y
编译VC程序时候报错:error MSB3073: 命令“copy /y 查看: 项目的属性->配置属性->生成事件->后期生成事件->命令行: copy /y "$ ...
- C# 客户端篇之实现Restful Client开发(RestSharp帮助类)
上篇文章<C# 服务端篇之实现RestFul Service开发(简单实用)>讲解到,如果开发一个简单的Restful风格的Service,也提到了简单创建一个Restful Client ...
- [工具] Altova UModel® 2017 is a UML tool for software modeling & application development.
https://cdn.sw.altova.com/v2017sp2a/en/MissionKitEnt2017sp2.exe https://cdn.sw.altova.com/v2017sp2a/ ...
- Druid连接池(二)
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...
- StreamSocket
转载自:http://blog.csdn.net/yuanguozhengjust/article/details/19175085 StreamSocket的基本流程和一般的Socket通信操作类似 ...
- nginx 禁止恶意域名解析
server { listen default_server; server_name _; ssl on; ssl_certificate /etc/nginx/cert/aaaa.pem; ssl ...
- css学习_css浮动
1.文档流介绍 网页布局的核心就是利用css来摆放盒子, 把盒子摆放在合适的位置. css的定位机制有以下3种(网页布局一般需要3种搭配使用): a.普通流(标准流) b.浮动 1.浮动只有左右. 2 ...