文章目录

  • 题目
  • 分析
  • 代码

题目

Query on a tree

分析

动态树(LCT)初探

代码

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;int read(){int x=0;bool f=0;char c=getchar();while(c<'0'||c>'9') f|=c=='-',c=getchar();while(c>='0'&&c<='9') x=x*10+(c^48),c=getchar();return f?-x:x;
}#define IL inline
#define LL long long
#define MAXN 50005
#define INF 0x7fffffffstruct Node{int Val,Max;Node *fa,*ch[2];
}*NIL,*ncnt,Sp[MAXN+5],*A[MAXN+5];IL Node *NewNode(int val){Node *p=++ncnt;p->Val=p->Max=val;p->fa=p->ch[0]=p->ch[1]=NIL;return p;
}
IL bool Dir(Node *u){return u->fa->ch[1]==u;
}
IL bool isRoot(Node *u){return u->fa==NIL||(u->fa->ch[0]!=u&&u->fa->ch[1]!=u);
}
IL void SetChild(Node *u,Node *v,bool d){u->ch[d]=v;if(v!=NIL)v->fa=u;
}
IL void PushUp(Node *u){u->Max=max(u->Val,max(u->ch[0]->Max,u->ch[1]->Max));
}IL void Rotate(Node *u){bool d=Dir(u);Node *y=u->fa;if(isRoot(y))u->fa=y->fa;elseSetChild(y->fa,u,Dir(y));SetChild(y,u->ch[!d],d);SetChild(u,y,!d);PushUp(y);
}
void Splay(Node *u){while(!isRoot(u)){Node *y=u->fa;if(isRoot(y))Rotate(u);else{if(Dir(u)==Dir(y))Rotate(y);elseRotate(u);Rotate(u);}}PushUp(u);
}
Node *Access(Node *u){Node *r=NIL;while(u!=NIL){Splay(u);SetChild(u,r,1);PushUp(u);r=u,u=u->fa;}return r;
}
Node *GetRoot(Node *u){Access(u),Splay(u);Node *r=u;while(r->ch[0]!=NIL)r=r->ch[0];Splay(r);return r;
}
IL void MakeRoot(Node *u){Access(u);Splay(u);
}
IL void Link(Node *u,Node *v){MakeRoot(u);u->fa=v;
}
IL void Cut(Node *u,Node *v){MakeRoot(u);Access(v);Splay(v);u->fa=NIL;v->ch[0]=NIL;
}int ID[MAXN+5];
struct Edge{int v,w,id;
};
vector<Edge> G[MAXN+5];
void Init(){NIL=ncnt=&Sp[0];NIL->fa=NIL->ch[0]=NIL->ch[1]=NIL;NIL->Val=NIL->Max=-INF;
}
void Modify(int e,int val){Node *p=A[ID[e]];Access(p);p->Val=val;PushUp(p);
}
int Query(int u,int v){Access(A[u]);Node *y=Access(A[v]);Splay(A[u]);int ret=y->ch[1]->Max;if(y!=A[u])ret=max(ret,A[u]->Max);return ret;
}
void dfs(int u,int fa){for(int i=0;i<int(G[u].size());i++){int v=G[u][i].v,w=G[u][i].w,id=G[u][i].id;if(v!=fa){ID[id]=v;A[v]=NewNode(w);A[v]->fa=A[u];dfs(v,u);}}
}int main(){int T=read();while(T--){Init();int N=read();for(int i=1;i<=N;i++)G[i].clear();for(int i=1;i<=N-1;i++){int u=read(),v=read(),w=read();G[u].push_back((Edge){v,w,i});G[v].push_back((Edge){u,w,i});}A[1]=NewNode(-INF);dfs(1,-1);while(1){char opt[10];scanf("%s",opt);if(opt[0]=='D')break;int u=read(),v=read();if(opt[0]=='C')Modify(u,v);elseprintf("%d\n",Query(u,v));}}return 0;
}

Query on a tree(LCT版)相关推荐

  1. SPOJ 375. Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 375. Query on a tree Problem code: QTREE You are given a t ...

  2. XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...

  3. [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

    首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 的两个白点间的最长路径 ...

  4. LCA SP913 QTREE2 - Query on a tree II

    SP913 QTREE2 - Query on a tree II 给定一棵n个点的树,边具有边权.要求作以下操作: DIST a b 询问点a至点b路径上的边权之和 KTH a b k 询问点a至点 ...

  5. hdu 4836 The Query on the Tree(线段树or树状数组)

    The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. 【Qtree】Query on a tree系列LCT解法

    Qtree1-7 Qtree1 裸的树链剖分,当然也可以用LCT写,就不说什么了... Qtree2 倍增lca,当然也可以用LCT写,就不说什么了... Qtree3 裸的树链剖分,当然也可以用LC ...

  7. BZOJ 3639: Query on a tree VII LCT_set维护子树信息

    用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...

  8. spoj 375 Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 题意: 给一颗树,每条边有一个权值.有两种操作: 1.修改某条边的值: 2.询问a.b两点路径上边权的最大值. 分析 ...

  9. SPOJ 375 query on a tree 树链剖分

    题意: 给一棵树型数据结构 ①支持修改边的权值      ②支持成段边权最值查询 树链剖分入门题. 树链剖分+线段树 用的notonlysuccess的线段树--不开结构体事先预处理的那种 我以前写的 ...

最新文章

  1. 事件分发机制并不是洪水猛兽
  2. hdu 3853 LOOPS (概率dp 逆推求期望)
  3. 傅里叶变换函数FFT的使用方法
  4. MPP 二、Greenplum数据加载
  5. Linux 中 elasticsearch6.3.0 单机安装
  6. 这个“专题”的导读好像忘了更新了
  7. USACO Section 1.2 Name That Number
  8. matlab三维三角网格,有限元分析利用matlab的gplot函数实现三维划分网格的方法
  9. 读取内存数据,大航海家3的编辑器的一点思路
  10. js控制页面只刷新一次
  11. idea提交项目出现push rejected
  12. 如何从零开始解读什么叫产品经理
  13. 5iABCDS原来是这样赋能 “严肃游戏”的!
  14. 『Java安全』反序列化-浅析Hessian反序列化POP链
  15. Eclipse如何导入jar包
  16. 我喜欢的郭敬明的文字
  17. 华硕编程竞赛11月JAVA专场 G题飞行棋 题解
  18. 机器人运动控制算法专栏介绍
  19. 软件加入使用时间_新人如何才能玩转时间机器字幕制作软件?时间机器字幕制作软件使用测评...
  20. < 在Vue中,为什么 v-if 和 v-for 不建议一起使用 ? >

热门文章

  1. WEB前端涉及的布局、结构化和标准化
  2. Delph32位色图标
  3. 使用等价类划分法和边界值分析法设计出学生成绩的测试用例
  4. Markdown技巧
  5. 【NLP】情感识别,积极、消极、中性(一)
  6. 猎户座计划软件测试,猎户座四核实力毋庸置疑_平板电脑_平板电脑评测-中关村在线...
  7. Flink系列之:基于Flink CDC2.0实现海量数据的实时同步和转换
  8. 虚拟机中Ubuntu开机时Gave up waiting for root...
  9. 智能钥匙存取柜,管理钥匙解决方案!
  10. 维度解析(第三章)- 二维