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 ...
随机推荐
- 微信小程序组件解读和分析:十、input输入框
input输入框组件说明: 本文介绍input 输入框的各种参数及特性. input输入框示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 01 02 03 04 0 ...
- Android组件化开发(注意事项)
1.Manifest合并 在Android studio编译项目时,无论你使用了几个Module都会把所有Manifest最终合并成一个,需要我们注意的是application标签下这个几个属性引用的 ...
- redis 在windows 集群
前言:为什么自己要花时间写一篇redis集群文章,网上众多的文章大都是思路正确,但是细节不足,这里写一篇文章记录自己部署时候遇到的问题,当下次再部署的时候避免跳入重复的坑. 上篇文章(http://w ...
- git创建分支及日常使用
克隆代码 git clone https://github.com/master-dev.git 查看所有分支 git branch --all # 默认只有master分支,所以会看到如下两个分支 ...
- 文档兼容性定义,使ie按指定的版本解析
作为开发人员,特别是作为Web的前端开发人员 ,最悲催的莫过于要不断的,不断的去调试各种浏览器的显示效果,而这其中最让人头痛的莫过于MS下的IE系列浏览器,在IE系列中的调试我们将会发现没有一个是好伺 ...
- 读取Java文件到byte数组的三种方式
package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...
- qt creator转换到 COFF 期间失败: 文件无效或损坏
转载请注明出处http://www.cnblogs.com/dachen408/p/7226198.html 环境 Qt5.5+Vs2010,删除vs2010安装目录bin下的cvtres.exe解决 ...
- SCHTASKS /CREATE
SCHTASKS "/" 这个符号前要加个空格才能运行成功 ,搞半天!
- xamarin 学习笔记01-环境配置
1.安装AndroidSDK 参考 2.安装NDK NDK下载地址:http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86_64.e ...
- CentOS6.8 RPM包安装快速zabbix22
CentOS6.8 RPM包安装快速zabbix22 yum install -y epel-release # yum install -y httpd php php-devel mysql-se ...