/*
解:标记区间端点,按深度标记上+下-。
然后用线段树维护求出最小的,再将它映射回来
*/
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100500
struct node {
int u,v,next;
}bian[N*2];
int f[N],top[N],fp[N],siz[N],son[N],fa[N],head[N],yong;
int deep[N],cnt;
vector<int>add[N],stra[N];
void init() {
yong=0;cnt=0;
memset(head,-1,sizeof(head));
memset(son,-1,sizeof(son));
}
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void dfs1(int u,int father,int d) {
deep[u]=d;
fa[u]=father;
siz[u]=1;
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(v!=father) {
dfs1(v,u,d+1);
siz[u]+=siz[v];
if(son[u]==-1||siz[son[u]]<siz[v])
son[u]=v;
}
}
return ;
}
void dfs2(int u,int tp) {
f[u]=++cnt;
fp[f[u]]=u;
top[u]=tp;
if(son[u]==-1)return ;
dfs2(son[u],tp);
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(v!=son[u]&&v!=fa[u])//u写成v了
dfs2(v,v);
}
return ;
}
void update(int u,int v,int w) {
int f1=top[u];
int f2=top[v];
while(f1!=f2) {
if(deep[f1]<deep[f2]) {
swap(f1,f2);swap(u,v);
}
add[f[f1]].push_back(w);
stra[f[u]].push_back(w);
u=fa[f1];
f1=top[u];
}
if(deep[u]>deep[v])
swap(u,v);
add[f[u]].push_back(w);
stra[f[v]].push_back(w);
return ;
}
struct nodee{
int l,r,node,num;
}tree[N*4];
void pushdown(int t) {
if(tree[t*2].num>=tree[t*2+1].num) {
tree[t].num=tree[t*2].num;
tree[t].node=tree[t*2].node;
}
else {
tree[t].num=tree[t*2+1].num;
tree[t].node=tree[t*2+1].node;
}
return ;
}
void build(int t,int l,int r) {
tree[t].l=l;
tree[t].r=r;
if(l==r){
// printf("%d\n",l);
tree[t].node=l;
tree[t].num=0;
return ;
}
int mid=(l+r)/2;
build(t*2,l,mid);
build(t*2+1,mid+1,r);
pushdown(t);
return ;
}
void qury(int t,int k,int nu) {
if(tree[t].l==tree[t].r) {
tree[t].num+=nu;
// printf("")
return ;
}
int mid=(tree[t].l+tree[t].r)/2;
if(k<=mid)
qury(t*2,k,nu);
else
qury(t*2+1,k,nu);
pushdown(t);
// printf("%d %d %d\n",tree[t].l,tree[t].r,tree[t].node);
}
int answer[N];
int Max(int v,int vv) {
return v>vv?v:vv;
}
int main() {
int n,m,i,j,u,v,w,mxx;
while(scanf("%d%d",&n,&m),n||m) {
init();
for(i=1;i<n;i++) {
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs1(1,1,0);
dfs2(1,1);
// printf("f[2]=%d\n",f[2]);
for(i=1;i<=n;i++)
add[i].clear(),stra[i].clear();
mxx=0;
while(m--) {
scanf("%d%d%d",&u,&v,&w);
update(u,v,w);
mxx=Max(mxx,w);
}
build(1,0,mxx);
for(i=1;i<=n;i++) {
int len=add[i].size();
// printf("%d\n",len);
for(j=0;j<len;j++) {
// printf("%d=%d\n",i,add[i][j]);
qury(1,add[i][j],1);
}
answer[fp[i]]=tree[1].node;
// printf("%d %d\n",tree[1].node,tree[1].num);
len=stra[i].size();
// printf("stralen=%d\n",len);
for(j=0;j<len;j++) {
// printf("st%d=%d\n",i,stra[i][j]);
qury(1,stra[i][j],-1);
}
add[i].clear(),stra[i].clear();
}
for(i=1;i<=n;i++)
printf("%d\n",answer[i]);
}
return 0;}

hdu 5029树链剖分的更多相关文章

  1. hdu 5893 (树链剖分+合并)

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  2. hdu 5052 树链剖分

    Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. hdu 4897 树链剖分(重轻链)

    Little Devil I Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  4. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  5. HDU 3966 (树链剖分+线段树)

    Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...

  6. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  7. HDU 3966 /// 树链剖分+树状数组

    题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...

  8. hdu 4729 树链剖分

    思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...

  9. hdu 3966 树链剖分

    思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...

随机推荐

  1. Person p = new Person("zhangsan",20);该句话都做了什么事情?

    1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中.2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化.3,在堆内 ...

  2. 自定义Image HtmlHelper

    public static void Image(this HtmlHelper helper, string src, string alt = null, object htmlAttribute ...

  3. 构建微服务开发环境2————安装IntelliJ IDEA

    [内容指引] 下载IntelliJ IDEA安装包: Mac版IDEA安装: Windows版IDEA按装. 一.下载IntelliJ IDEA安装包 访问官方网址:https://www.jetbr ...

  4. 老式浏览器支持html5和css3

    在IE页面的head标签里面加入   <!-[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/ ...

  5. Django系列:(1)PyCharm下创建并运行我们的第一个Django工程

    准备工作: 假设读者已经安装好python 2x或3x,以及安装好Django,以及Pycharm. 我的配置: – Python 2.7.11 – Pycharm Professional 5.0. ...

  6. 常用css属性拓展

    text-overflow:clip | ellipsis(默认值:clip)clip:当内联内容溢出块容器时,将溢出部分裁切掉.ellipsis:当内联内容溢出块容器时,将溢出部分替换为(...). ...

  7. MIUI类ROM如何正确修改dpi

    (以下以MIUI为例) 在miui上,如果通过简单的修改build.prop会导致图标重绘错误,App图标分裂.此时配合一条简单的命令即可实现完美无bug的dpi修改. 1.使用终端模拟器执行su 2 ...

  8. Android(java)学习笔记202:JNI之hello.c(c代码功能实现)指针语法解析

    1. 接下来我们细讲分析一下前面一讲中,c功能实现的代码: (1)hello.c : #include <jni.h> char* getHello() { //////// return ...

  9. SpringBoot 快速开发框架

    学习资源:https://ke.qq.com/course/260513(这是Springboot升级版本教程,里面还有一个初级版本的) 1.第一个测试程序,那个覆盖方法加上@Override会报错, ...

  10. 反射(hasattr,getattr,delattr,setattr)

    反射(hasattr,getattr,setattr,delattr) 反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有四个内置函数: hasattr ...