spoj 375 Query on a tree (树链剖分)
Query on a tree
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1.
We will ask you to perfrom some instructions of the following form:
- CHANGE i ti : change the cost of the i-th edge to ti
or - QUERY a b : ask for the maximum edge cost on the path from node a to node b
Input
The first line of input contains an integer t, the number of test cases (t <= 20). t test cases follow.
For each test case:
- In the first line there is an integer N (N <= 10000),
- In the next N-1 lines, the i-th line describes the i-th edge: a line with three integers a b c denotes an edge between a, b of cost c (c <= 1000000),
- The next lines contain instructions "CHANGE i ti" or "QUERY a b",
- The end of each test case is signified by the string "DONE".
There is one blank line between successive tests.
Output
For each "QUERY" operation, write one integer representing its result.
Example
- Input:
- 1
- 3
- 1 2 1
- 2 3 2
- QUERY 1 2
- CHANGE 1 3
- QUERY 1 2
- DONE
- Output:
- 1
- 3
第一次接触树链剖分,貌似是用来处理对树的边权的多次询问,然后对边权进行编号,转化为节点之间的询问。具体关于树链剖分的解析见 http://blog.csdn.net/acdreamers/article/details/10591443
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <time.h>
- #include <string>
- #include <map>
- #include <stack>
- #include <vector>
- #include <set>
- #include <queue>
- #define met(a,b) memset(a,b,sizeof a)
- #define pb push_back
- #define lson(x) ((x<<1))
- #define rson(x) ((x<<1)+1)
- using namespace std;
- typedef long long ll;
- const int N=1e5+;
- const int M=N*N+;
- int dep[N],siz[N],fa[N],id[N],son[N],val[N],top[N]; //top 最近的重链父节点
- int num;
- vector<int> v[N];
- struct tree {
- int x,y,val;
- void read() {
- scanf("%d%d%d",&x,&y,&val);
- }
- };
- tree e[N];
- void dfs1(int u, int f, int d) {
- dep[u] = d;
- siz[u] = ;
- son[u] = ;
- fa[u] = f;
- for (int i = ; i < v[u].size(); i++) {
- int ff = v[u][i];
- if (ff == f) continue;
- dfs1(ff, u, d + );
- siz[u] += siz[ff];
- if (siz[son[u]] < siz[ff])
- son[u] = ff;
- }
- }
- void dfs2(int u, int tp) {
- top[u] = tp;
- id[u] = ++num;
- if (son[u]) dfs2(son[u], tp);
- for (int i = ; i < v[u].size(); i++) {
- int ff = v[u][i];
- if (ff == fa[u] || ff == son[u]) continue;
- dfs2(ff, ff);
- }
- }
- struct Tree {
- int l,r,val;
- };
- Tree tree[*N];
- void pushup(int x) {
- tree[x].val = max(tree[lson(x)].val, tree[rson(x)].val);
- }
- void build(int l,int r,int v) {
- tree[v].l=l;
- tree[v].r=r;
- if(l==r) {
- tree[v].val = val[l];
- return ;
- }
- int mid=(l+r)>>;
- build(l,mid,v*);
- build(mid+,r,v*+);
- pushup(v);
- }
- void update(int o,int v,int val) { //log(n)
- if(tree[o].l==tree[o].r) {
- tree[o].val = val;
- return ;
- }
- int mid = (tree[o].l+tree[o].r)/;
- if(v<=mid)
- update(o*,v,val);
- else
- update(o*+,v,val);
- pushup(o);
- }
- int query(int x,int l, int r) {
- if (tree[x].l >= l && tree[x].r <= r) {
- return tree[x].val;
- }
- int mid = (tree[x].l + tree[x].r) / ;
- int ans = ;
- if (l <= mid) ans = max(ans, query(lson(x),l,r));
- if (r > mid) ans = max(ans, query(rson(x),l,r));
- return ans;
- }
- int Yougth(int u, int v) {
- int tp1 = top[u], tp2 = top[v];
- int ans = ;
- while (tp1 != tp2) {
- if (dep[tp1] < dep[tp2]) {
- swap(tp1, tp2);
- swap(u, v);
- }
- ans = max(query(,id[tp1], id[u]), ans);
- u = fa[tp1];
- tp1 = top[u];
- }
- if (u == v) return ans;
- if (dep[u] > dep[v]) swap(u, v);
- ans = max(query(,id[son[u]], id[v]), ans);
- return ans;
- }
- void Clear(int n) {
- for(int i=; i<=n; i++)
- v[i].clear();
- }
- int main() {
- int T;
- scanf("%d",&T);
- while(T--) {
- int n;
- scanf("%d",&n);
- for(int i=; i<n; i++) {
- e[i].read();
- v[e[i].x].push_back(e[i].y);
- v[e[i].y].push_back(e[i].x);
- }
- num = ;
- dfs1(,,);
- dfs2(,);
- for (int i = ; i < n; i++) {
- if (dep[e[i].x] < dep[e[i].y]) swap(e[i].x, e[i].y);
- val[id[e[i].x]] = e[i].val;
- }
- build(,num,);
- char s[];
- while(~scanf("%s",&s) && s[]!='D') {
- int x,y;
- scanf("%d%d",&x,&y);
- if(s[]=='Q')
- printf("%d\n",Yougth(x,y));
- if (s[] == 'C')
- update(,id[e[x].x],y);
- }
- Clear(n);
- }
- return ;
- }
spoj 375 Query on a tree (树链剖分)的更多相关文章
- SPOJ 375 Query on a tree 树链剖分模板
第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...
- SPOJ QTREE Query on a tree 树链剖分+线段树
题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...
- spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)
传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...
- SPOJ QTREE Query on a tree ——树链剖分 线段树
[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...
- SPOJ QTREE Query on a tree --树链剖分
题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...
- spoj 375 QTREE - Query on a tree 树链剖分
题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...
- SPOJ Query on a tree 树链剖分 水题
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
- Bzoj 2588 Spoj 10628. Count on a tree(树链剖分LCA+主席树)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Description 给定一棵N个节点的树,每个点 ...
随机推荐
- net对象的克隆
class Person { public string name; public List<string> hobby; } void main() { Person p1 = new ...
- 安装cloudbase-init和qga批处理
@echo off title Auto Install color 1F ::CloudBase-Init echo. msiexec /i \\192.168.122.47\cloudbase\C ...
- [poj] 1204 Word Puzzles || AC自动机
原题 给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示 AC自动机的板子题. 对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑 ...
- BZOJ 1876 [SDOI2009] SuperGcd | PY好题
题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...
- Lettcode Kth Largest Element in an Array
Lettcode Kth Largest Element in an Array 题意:在无序数组中,寻找第k大的数字,注意这里考虑是重复的. 一直只会简单的O(nlogn)的做法,听说这题有O(n) ...
- 自动设置 rem es模块写法
export default function () { let html = document.documentElement; function onWindowResize() { if (ht ...
- 让JS帮你决定午餐吃什么吧
最愁就是每天中午吃什么了,有空就做了个 JavaScript 轮播随机选择.会轮播预先自定义的菜单中,然后点选定的时候确定一款.代码可以查看本页源代码获得,你可以自定义修改菜单数组. 效果演示 准备选 ...
- vue的main.js
import Vue from 'vue'; import App from './App.vue'; //================http 请求======================= ...
- Extra Judicial Operation
Description The Suitably Protected Programming Contest (SPPC) is a multi-site contest in which conte ...
- 怎么用tomcat对socket接口的程序进行调试
对socket(套接字)的demo方法大多都是用main方法进行测试的,那如何用tomcat进行测试呢? 这里需要借助一个工具:工具的名字是:Sockettool.exe .下图是该工具的内容.连上监 ...