【题目分析】

垃圾vjudge又挂了。

树链剖分裸题。

垃圾spoj,交了好几次,基本没改动却过了。

【代码】(自带常数,是别人的2倍左右)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 20005 int T,n,fr[maxn],h[maxn],to[maxn],ne[maxn],w[maxn],en=0;
int mx[maxn<<3],fa[maxn],siz[maxn],son[maxn],pos[maxn],dep[maxn],tot=0;
int top[maxn],a[maxn],x,y,L,R,C,X,tofa[maxn];
char opt[10]; int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} void add(int a,int b,int c)
{fr[en]=a;to[en]=b;ne[en]=h[a];w[en]=c;h[a]=en++;} void rd()
{
n=Getint();
for(register int i=1;i<n;++i)
{
int a=Getint(),b=Getint(),c=Getint();
add(a,b,c),add(b,a,c);
}
}
void init()
{
memset(fa,0,sizeof fa);
memset(son,0,sizeof son);
memset(h,-1,sizeof h);
tot=en=0;
} void dfs1(int o)
{
siz[o]=1;
for (register int i=h[o];i>=0;i=ne[i])
if (fa[o]!=to[i]){
fa[to[i]]=o;
tofa[to[i]]=w[i];
dep[to[i]]=dep[o]+1;
dfs1(to[i]);
siz[o]+=siz[to[i]];
if (siz[son[o]]<siz[to[i]]) son[o]=to[i];
}
} void dfs2(int o,int tp,int ww)
{
// printf("dfs2 _ %d %d %d son is %d\n",o,tp,ww,son[o]);
top[o]=tp;pos[o]=++tot;a[pos[o]]=ww;
if (son[o]==0) return;
// for (register int i=h[o];i>=0;i=ne[i])
// if (to[i]==son[o])
// dfs2(son[o],tp,w[i]);
// printf("%d to %d as height son\n",o,son[o]);
dfs2(son[o],tp,tofa[son[o]]);
for (register int i=h[o];i>=0;i=ne[i])
if (fa[o]!=to[i]&&to[i]!=son[o])
dfs2(to[i],to[i],w[i]);
} void build(int o,int l,int r)
{
int mid=l+r>>1;
if (l==r){mx[o]=a[l];return;}
build(o<<1,l,mid); build(o<<1|1,mid+1,r);
mx[o]=max(mx[o<<1],mx[o<<1|1]);
} void modify(int o,int l,int r)
{
if (l==r) {mx[o]=C;return;}
int mid=l+r>>1;
if (X<=mid) modify(o<<1,l,mid);
else modify(o<<1|1,mid+1,r);
mx[o]=max(mx[o<<1],mx[o<<1|1]);
} int query(int o,int l,int r)
{
if (L<=l&&r<=R) return mx[o];
int mid=l+r>>1;
if (R<=mid) return query(o<<1,l,mid);
if (L>mid) return query(o<<1|1,mid+1,r);
else return max(query(o<<1,l,mid),query(o<<1|1,mid+1,r));
} int ask(int x,int y)
{
int ret=0;
while (top[x]!=top[y])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
L=pos[top[x]];R=pos[x];
ret=max(ret,query(1,1,n));
x=fa[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
if (x==y) return ret;
L=pos[son[y]];R=pos[x];
ret=max(ret,query(1,1,n));
return ret;
} int main()
{
freopen("in.txt","r",stdin);
freopen("wa.txt","w",stdout);
T=Getint();
while (T--)
{
init(),rd();
dfs1(1);dfs2(1,1,0);
// printf("n is %d\n",n);
build(1,1,n);
while (scanf("%s",opt)&&opt[0]!='D')
{
if (opt[0]=='Q')
{
x=Getint();y=Getint();
printf("%d\n",ask(x,y));
}
else
{
x=Getint(); y=Getint();
L=fr[x*2-1];R=to[x*2-1];
if (fa[L]==R) X=pos[L],C=y,modify(1,1,n);
else X=pos[R],C=y,modify(1,1,n);
}
}
}
return 0;
}

  

SPOJ QTREE Query on a tree ——树链剖分 线段树的更多相关文章

  1. Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

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

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

  3. 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 ...

  4. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  5. 【CF725G】Messages on a Tree 树链剖分+线段树

    [CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息 ...

  6. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

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

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

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

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

  9. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  10. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

随机推荐

  1. python深浅拷贝问题

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 又叫变量对对象的引用 l ...

  2. selenium-Python之定位下拉框选择

    1.通过select 进行定位下拉框 下拉框如图所示 通过代码定位 #通过index进行选择Select(driver.find_element_by_id("cardType") ...

  3. spring 常用问题汇总

    2018.02.06 SpringMVC中StringHttpMessageConverter乱码处理 http://blog.csdn.net/wangyangbto/article/details ...

  4. ubuntu 14.04 安装npm

    1. 安装 sudo apt install nodejs-legacy sudo apt install npm  

  5. 设置windows status bar隐藏

    info.plist View controller-based status bar appearance 为 NO CGContextSaveGState: invalid context 0x0 ...

  6. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)

    前文有一篇手工生成的说明,地址: http://www.cnblogs.com/xiaolive/p/4874605.html, 现在这个补充一下在idea里面的自动版本的数据库逆向生成工具: 一.g ...

  7. 多进程Queue

    进程间通讯 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queues 使用方法跟threading里的queue差不多 from multiprocessing impo ...

  8. 初涉最小表示法&&bzoj1398: Vijos1382寻找主人 Necklace

    把最小表示法的坑填了 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的) ...

  9. GIMP的Path的合并于复制

    1/Path的复制不能像图层一样简单的复制粘贴,只有通过merge的方法实现: 使要合并的Path处于可见状态,右击Path工具栏:   合并前与合并后比较: 2/向不同文件复制Path: 到另外一个 ...

  10. Python9-函数-day9

    初识函数定义与调用 def my_len(): i = 0 for k in s1: i +=1 return i #返回值 # s = 'tim' s1 = '班主任阿娇' length =my_l ...