hdu 5029树链剖分
/*
解:标记区间端点,按深度标记上+下-。
然后用线段树维护求出最小的,再将它映射回来
*/
#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树链剖分的更多相关文章
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- hdu 5052 树链剖分
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 4897 树链剖分(重轻链)
Little Devil I Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu 5274 树链剖分
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- HDU 3966 /// 树链剖分+树状数组
题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...
- hdu 4729 树链剖分
思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...
- hdu 3966 树链剖分
思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...
随机推荐
- JSR-303原生支持的限制
@Null: 限制只能为null@NotNull: 限制必须不为null@AssertFalse: 限制必须为false@AssertTrue: 限制必须为true@DecimalMax(value) ...
- .NET框架概述
.NET战略目标: 任何时候(when),任何地方(where),使用任何工具(what)都能通过.NET的服务获得网络上的任何信息. .NET优势: 1.提供了一个面向对象的编程环境,完全支持面向对 ...
- C#特性的介绍及应用场景
1.特性的任务:特性就是为了支持对象添加一些自我描述的信息,不影响类封装的前提添加额外信息.如果你用这个信息,那特性就有用:如果你不需要这个信息,那么这个特性就没用. 2.特性的基类:Attribut ...
- AJPFX总结面向对象思想设计原则
面向对象思想设计原则 A.单一职责原则 其实就是开发人员经常说的”高内聚,低耦合” 也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原 ...
- 30款jQuery常用网页焦点图banner图片切换
1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...
- RGB、YUV和YCbCr介绍【转】
RGB: 就是常说的红(Red).绿(Green)和蓝(Blue),每个图像的像素点由RGB三个通道的值组成. YUV和YCbCr: YUV与RGB的转换: Y'= 0.299*R' + 0.587* ...
- JVM最多能创建多少个线程: unable to create new native thread
转载自:http://www.rigongyizu.com/jvm-max-threads/ 有应用报出这样的异常“java.lang.OutOfMemoryError: unable to crea ...
- leetcode_378. Kth Smallest Element in a Sorted Matrix_堆的应用
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
- 测试ip是否可以ping通
7.写一个脚本hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通.如果能ping通,则提示用户“该IP地址可访问”:如果不可ping通,则提示用户“该IP地址不可访问 参考脚本 ...
- java.util.MissingResourceException: Can't find bundle for base name db, locale zh_CN
在使用Bundle来加载配置文件的时候, 爆出了这个错误: 原因? 没有找到需要加载的配置文件,因为配置文件必须放在src目录下面, 如果放进了com.bj186.crm的包下面,就必须添加包的名称到 ...