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 ...
随机推荐
- 首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。
package day02; import java.util.Arrays; import java.util.Random; public class Test01 { public static ...
- 外文翻译 《How we decide》赛场上的四分卫
本书导言翻译 为了能看懂这一章,先做了如下的功课: 百度百科 四分卫 国家橄榄球联盟中文站 在2002年超级碗赛场上,比赛的时间仅剩80秒,两队比分持平.新英格兰爱国者队于17码的位置执球,他们的对手 ...
- (四)SpringIoc之Bean装配
在pom.xml的依赖 <dependencies> <!--测试包--> <dependency> <groupId>junit</groupI ...
- Android SDK镜像更新网速慢的解决问题
通过更换代理解决 Android SDK 在线更新镜像服务器资源:大连东软信息学院镜像服务器地址:http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:IP ...
- R Programming week 3-Loop functions
Looping on the Command Line Writing for, while loops is useful when programming but not particularly ...
- 重构28-Rename boolean method(重命名布尔方法)
你也可以说这并不是一个真正的重构,因为方法实际上改变了,但这是一个灰色地带,可以开放讨论.一个拥有大量布尔类型参数的方法将很快变得无法控制,产生难以预期的行为.参数的数量将决定分解的方法的数量.来看看 ...
- SQL 索引自动维护计划脚本
脚本功能: 1,查询数据库中,碎片率在5%以上(官方推荐),有一定数据里的表的索引. 2.如果碎片率在5%<碎片率<=30% 执行重新组织索引.如果在30%以上,执行重建索引 建议在执行 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...
- vscode前端开发软件配搭好用的插件
使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...
- 深入理解python对象及属性
类属性和实例属性首先来看看类属性和类实例的属性在python中如何存储,通过__dir__方法来查看对象的属性 >>> class Test(object): pass>> ...