【题目分析】

垃圾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. vba 两个表 信息合体一个表格

    1 把Excel某一区域的内容读入到数组中: Dim strArray() As Variant Dim wk_data As Variant Set wk_data = Sheets("S ...

  2. 如何找到SAP Cloud for Customer标准培训和认证方面的信息

    有一些朋友询问我如何在SAP官网上找到和SAP Cloud for Customer相关的标准培训信息,我这里把步骤写出来: 登录SAP官网https://training.sap.com 输入和Cl ...

  3. 添加 SSH 公钥

    生成 SSH 密钥 ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM" 获取 SSH 公钥信息 cat ~/.ssh/id_rsa.pu ...

  4. 迅为iMX6Q/PLUS开发板烧写设备树内核 Qt 系统

    迅为iMX6Q 和 iMX6PLUS 两个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致. 如果用的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光盘 ...

  5. dp 20190618

    C. Party Lemonade 这个题目是贪心,开始我以为是背包,不过也不太好背包,因为这个L都已经是1e9了. 这个题目怎么贪心呢?它是因为这里有一个二倍的关系,所以说val[i]=val[i- ...

  6. Java调用存储过程出现Bug,sql语法错误

    因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.

  7. Python字符编码补充

    字符编码: Python字符编码贯穿Python学习的始终,现在应用的是Python2中字符编码的问题是很多的. 这次是要彻底解决Python字符编码的问题!!! 1 字符编码的发展过程: 1 .AS ...

  8. zust_第二周——瞎扯系列

    首先来原题列表: A:Gridland http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1037 B:HangOver htt ...

  9. BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)

    题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...

  10. java在线聊天项目0.4版本 制作服务端接收连接,客户端连接功能 新增客户端窗口打开时光标指向下边文本域功能,使用WindowListener监听WindowAdapter

    建一个服务端类ChatServer,用于设置端口接收连接 package com.swift; import java.io.IOException; import java.net.ServerSo ...