将树映射在线段上进行操作 然后每个 重链变成一个连续的区间
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>
#pragma comment(linker,"/STACk:10240000,10240000")
using namespace std;
const int maxn=;
vector<int>F[maxn];
int son[maxn],num[maxn],fa[maxn],top[maxn],p[maxn],fp[maxn],pos,depth[maxn],ans[maxn];
vector<int>P[maxn];
int loc,v;
struct SegmentItree{
int num[maxn*],id[maxn*];
void build(int o,int L, int R){
num[o]=;
id[o]=;
if(L>=R){
num[o]=; id[o]=L;
return ;
}
int mid = (L+R)/;
build(o*,L,mid );
build(o*+,mid+,R);
}
void maintain(int o){
num[o]=;
id[o]=;
if(num[o*]==&&num[o*+]==)return;
if( num[o*] >= num[o*+] ){
num[o]=num[o*];
id[o]=id[o*];
} else{
num[o] =num[o*+];
id[o]=id[o*+];
}
}
void add(int o,int L, int R){
if(L>=R){
num[o]+=v;
return ;
}
int mid = (L+R)>>;
if(loc<=mid){
add(o*,L,mid);
}else{
add(o*+, mid+,R);
}
maintain(o);
}
}T;
void inti(int n){
for(int i=; i<=n+; ++i)
F[i].clear(),P[i].clear();
pos=;
}
void dfs(int cur, int per,int dep){
depth[cur]=dep;
son[cur]=-;
fa[cur]=per;
num[cur]=;
int Len= F[cur].size();
for(int i=; i<Len; ++i){
int to = F[cur][i];
if(to==per) continue;
dfs(to,cur,dep+);
num[cur]+=num[to];
if( son[ cur ] == - || num[ son[cur] ]< num[to] ) son[cur]=to;
}
}
void finde(int cur , int per, int xx){
top[cur]=xx;
pos++;
p[cur]=pos;
fp[pos]=cur;
if(son[cur]!=-)
finde(son[cur],cur,xx);
int len = F[cur].size();
for(int i=; i<len ;++i ){
int to= F[cur][i];
if(to==per||to==son[cur])continue;
finde(to,cur,to);
}
}
void solve(int x, int y,int d){
int f1=top[x],f2=top[y];
while(f1!=f2){
if(depth[f1]<depth[f2]){
int temp = x; x=y; y= temp;
temp=f1; f1=f2; f2=temp;
}
P[ p[f1] ].push_back(d);
P[ p[x]+ ].push_back(-d);
x=fa[f1];
f1=top[x];
}
if(depth[x]>depth[y]){
int temp = x; x = y ; y= temp;
}
P[p[x]].push_back(d);
P[p[y]+].push_back(-d);
}
int main()
{
int n,m;
for(;;){
scanf("%d%d",&n,&m);
if(n==&&m==)break;
inti(n);
for(int i=; i<n ;++i ){
int a,b;
scanf("%d%d",&a,&b);
F[a].push_back(b);
F[b].push_back(a);
}
dfs(,,);
finde(,,);
int N=;
for(int i=; i<m; ++i){
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
solve(a,b,d);
N=max(d,N);
}
memset(ans,,sizeof(ans));
if(N!=){
T.build(,,N);
for(int i=; i<=n; ++i){
int L = P[i].size();
for(int j=; j<L; ++j){
int to= P[i][j];
if(to>){
v=;
loc=to;
}else{
v=-;
loc=-to;
}
T.add(,,N);
}
if(T.num[]!=)
ans[fp[i]]=T.id[];
else ans[fp[i]]=;
}
}
for(int i=; i<=n; ++i)
printf("%d\n",ans[i]);
}
return ;
}

hdu5029 树链剖分 + 线段树的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  3. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  4. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  5. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  6. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  7. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  8. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  9. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  10. bzoj2243[SDOI2011]染色 树链剖分+线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9012  Solved: 3375[Submit][Status ...

随机推荐

  1. EF-CodeFirst-数据库初始化

    数据库初始化 之前看到Code-First会自动根据域模型创建数据库,下图展示了一个数据库初始化工作流程,该工作流程基于从DbContext派生的上下文类的基础构造函数中传递的参数 如上图所示,上下文 ...

  2. pacakge-info.java

    翻看以前的笔记,看到一个特殊的java文件:pacakge-info.java,虽然有记录,但是不全,就尝试着追踪一下该问题, 分享一下流水账式的结果. 首先,它不能随便被创建.在Eclipse中, ...

  3. 根据后台加载数据,添加loading动画

    <script> var current = 0; var hit = @hits; $(this).scroll(function(){ var viewHeight =$(this). ...

  4. 如何下载网页上的视频和flash的方法

    下面介绍一种下载视频的简便方法,这种方法不需要安装任何下载软件,而且适合所有 FLV(Flash Video)格式的视频文件. 第一步 清空Temporary Internet Files(临时网络文 ...

  5. 【PyQt5-Qt Designer】工具箱(QToolBox)控件的使用

    工具箱(QToolBox)+toolButton+tabWidget 总体介绍 QToolBox类提供了一列选项卡的小部件(选项卡内含项目). 工具箱是一个小部件,它将选项卡一个一个的显示,当前项目显 ...

  6. 两个java工程之间的相互调用方法

    如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种 ...

  7. springMVC(二): @RequestBody @ResponseBody 注解实现分析

    一.继承结构 @RequestBody.@ResponseBody的处理器:RequestResponseBodyMethodProcessor @ModelAttribute处理器: ModelAt ...

  8. centos安装Django之三:安装python

    这是centos安装Django系列第三篇,安装python.centos系统已经自带了python2.6,但是它被系统很多程序所依赖,不建议删除.我们可以使用以下命令来查看我们使用的Python版本 ...

  9. jsp在select中的option中编写if标签

    <select onchange="lxx(this)"> <option value="">全部</option> < ...

  10. 关于运行python脚本产生__pycache__

    是什么? 用python编写好一个工程,在第一次运行后,总会发现工程根目录下生成了一个__pycache__文件夹,里面是和py文件同名的各种 *.pyc 或者 *.pyo 文件. python脚本编 ...