【题目分析】

垃圾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. iOS 画圆图片的几种方法

    方法一: self.cycleImv= [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)]; [self.view addS ...

  2. Android - CollapsingToolbarLayout 完全解析

    CollapsingToolbarLayout 是 google 在其推出的design libiary 中给出的一个新型控件.其可以实现的效果类似于: toolbar是透明的,有一个背景图片以及大标 ...

  3. Python3实现自动备份

    需求 将重要文件备份到指定目录,存档文件名称为“当前日期.zip”. 前提 1) Windows系统 2) Python 3以上版本 旗舰版 #!usr/bin/python # -*- coding ...

  4. HTML5文档结构 摘要

    <!DOCType html>--声明文档结构类型 <html lang=zh-cn> <head> <meta charset=utf-8> < ...

  5. SQLite基础教程目录

    SQLite基础教程目录 SQLite主页 SQLite概述 SQLite -安装 SQLite -命令 SQLite -语法 SQLite -数据类型 SQLite -创建数据库 SQLite -附 ...

  6. Django 模型ORM

    from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoF ...

  7. Html5怎么导出图片

    其实很简单, 首先需要两个js文件 jquery.min.js html2canvas.js 直接上代码,几行就解决了 <a id="example1" onclick=&q ...

  8. iPhone Scrollbars with iScroll

    Since we've had web browsers and JavaScript, we've been intent on replacing native browser functiona ...

  9. java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)

    SWT成功激活后 new一个JDialog 调整到Design视图 默认的视图模式是BorderLayout,无论你怎么拖拽,只能放到东西南北中的位置上 所以,我们把视图模式调整为AbsoluteLa ...

  10. odoo10 fields.Selection 根据权限显示不同的selection内容

    摘要:一般作为下拉选项,selection的选项内容是固定,针对一些特殊要求,根据权限组显示不同的selection内容的,可以参考odoo源码的. 前提:基于 odoo10.0 的源码 参考源码1: ...