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 ...
随机推荐
- Windowsforms 中对文件操作
文件及文件夹操作: 引用命名空间:using system .IO; 1.File类: 创建:File.Create(路径);——返回FileStream FileStream fs = File.C ...
- 【Hibernate】Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
今天用hibernate框架写crm项目时遇到报错: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' n ...
- 移动端rem
手机有很多尺寸的型号.使用rem来做为大小单位可以达到兼容的目的. 方法一:js测量手机尺寸,设置font-size:为手机屏幕width /10 + ‘px’.即10rem 为手机屏幕width. ...
- Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传
http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html
- Android基础夯实--重温动画(三)之初识Property Animation
每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...
- git --删除文件、重命名
修改最后一次提交 git commit --amend -m “” 删除文件:. git rm <需要删除的文件> 只是删除当前工作目录和暂存区的文件,也就是取消跟踪.在下次提交时不纳入版 ...
- 掌握Spark机器学习库-08.2-朴素贝叶斯算法
数据集 iris.data 数据集概览 代码 import org.apache.spark.SparkConf import org.apache.spark.ml.classification.{ ...
- 用idea+maven编译打包spark project core错误:java.lang.RuntimeException: Unable to load a Suite class
Discovery starting. *** RUN ABORTED *** java.lang.RuntimeException: Unable to load a Suite class tha ...
- 最新WIN10系统32位和64位纯净版自动激活版1010074 V2015年
系统来自:系统妈 本系统定位于个人在家庭.网吧.办公环境使用,采用久经考验的精简方法和体积压缩技术,在小巧体积中提供了几乎100%的原版Win10兼容性.经过在多个版本的更新和升级过程后,已经被证明能 ...
- 浅谈CSS中的定位知识
1,静态定位(static) 表示按照正常定位方案,元素盒按照在文档流中出现的顺序依次格式化: 2,相对定位(relative) 将移动元素盒,但是它在文档流中的原始空间会保留下来: 相对定位元素有如 ...