题目:Query on The Trees

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
const int maxn=100011;
const int INF=0x7fffffff;
using namespace std;struct SplayTree
{int val,mn,lazy;bool remark;int ch[2],pre;
};SplayTree *tree;
int N;
int val[maxn];void Init_Splay(int x)
{tree[x].ch[0]=tree[x].ch[1]=tree[x].pre=0;tree[x].remark=0;tree[x].val=val[x];tree[x].mn=val[x];
}bool IsRoot(int x)
{return !tree[x].pre || (tree[tree[x].pre].ch[0]!=x && tree[tree[x].pre].ch[1]!=x);
}void DynamicTree(int n)
{N=n;tree=new SplayTree[n+1];for(int i=0; i<=n; i++) Init_Splay(i);tree[0].val=-INF;tree[0].mn=-INF;
}void Inc(int x,int d)
{tree[x].val+=d;tree[x].mn+=d;tree[x].lazy+=d;
}void Rev(int x)
{swap(tree[x].ch[0],tree[x].ch[1]);tree[x].remark^=1;
}void PushDown(int x)
{if(!x) return;if(tree[x].lazy){if(tree[x].ch[0]) Inc(tree[x].ch[0],tree[x].lazy);if(tree[x].ch[1]) Inc(tree[x].ch[1],tree[x].lazy);tree[x].lazy=0;}if(tree[x].remark){if(tree[x].ch[0]) Rev(tree[x].ch[0]);if(tree[x].ch[1]) Rev(tree[x].ch[1]);tree[x].remark=0;}
}void Update(int x)
{if(!x) return;tree[x].mn=tree[x].val;if(tree[x].ch[0]) tree[x].mn=max(tree[tree[x].ch[0]].mn,tree[x].mn);if(tree[x].ch[1]) tree[x].mn=max(tree[tree[x].ch[1]].mn,tree[x].mn);
}void Rotate(int p,int c)
{int x=tree[p].pre,y=tree[x].pre;tree[p].pre=y;tree[x].pre=p;if(y) if(x==tree[y].ch[0]) tree[y].ch[0]=p;else if(x==tree[y].ch[1]) tree[y].ch[1]=p;tree[x].ch[!c]=tree[p].ch[c];if(tree[x].ch[!c]) tree[tree[x].ch[!c]].pre=x;tree[p].ch[c]=x;Update(x);
}int stack[maxn];void Splay(int x)
{int top=1;stack[0]=x;for(int q=x; !IsRoot(q);) stack[top++]=(q=tree[q].pre);while(top) PushDown(stack[--top]);while(!IsRoot(x)){int q=tree[x].pre;if(IsRoot(q)) if(tree[q].ch[0]==x) Rotate(x,1);else Rotate(x,0);else{if(q==tree[tree[q].pre].ch[0])if(tree[q].ch[0]==x) Rotate(q,1),Rotate(x,1);else Rotate(x,0),Rotate(x,1);else if(x==tree[q].ch[1]) Rotate(q,0),Rotate(x,0);else Rotate(x,1),Rotate(x,0);}}Update(x);
}int Head(int x)
{Splay(x);for(PushDown(x); tree[x].ch[0]; x=tree[x].ch[0]) PushDown(x);Splay(x);return x;
}int Expose(int x)
{int y;for(y=0; x; x=tree[x].pre) Splay(x),PushDown(x),tree[x].ch[1]=y,Update(y=x);return y;
}void ChangeRoot(int x)
{Rev(Expose(x));
}void Change(int x,int y,int val)
{ChangeRoot(y);Expose(x);Splay(x);tree[x].val+=val;tree[x].lazy+=val;tree[x].mn+=val;
//    PushDown(x);
//    Update(x);
}int AskMax(int x,int y)
{ChangeRoot(x);Expose(y);Splay(y);return tree[y].mn;
}void Link(int x,int y)//link操作即为链接两个树,那么要先进性expose操作,把到路径上的边都变为实边,这样才能进行把x调整到根部,进而通过更改祖先来进行链接
{ChangeRoot(x);Splay(x);tree[x].pre=y;
}void Cut(int x,int y)
{ChangeRoot(y);Splay(x);if(tree[x].ch[0]){tree[tree[x].ch[0]].pre=tree[x].pre;tree[x].pre=tree[x].ch[0]=0;}else tree[x].pre=0;
}int LCA(int x,int y)
{int p=Head(Expose(x));int q=Expose(y),w=Head(q);if(p==w) return q;return 0;
}struct data
{int x,y;
} a[maxn];int main()
{int n,m;while(scanf("%d",&n)==1){for(int i=1; i<n; i++) scanf("%d%d",&a[i].x,&a[i].y);val[0]=val[n+1]=-INF;for(int i=1; i<=n; i++) scanf("%d",&val[i]);DynamicTree(n+1);for(int i=1; i<n; i++) Link(a[i].x,a[i].y);scanf("%d",&m);for(int i=1; i<=m; i++){int c;int x,y,val;scanf("%d",&c);if(c==1){scanf("%d%d",&x,&y);if(!LCA(x,y)) Link(x,y);else printf("-1\n");}else if(c==2){scanf("%d%d",&x,&y);if(LCA(x,y) && x!=y) Cut(y,x);else printf("-1\n");}else if(c==3){scanf("%d%d%d",&val,&x,&y);if(LCA(x,y)) Change(x,y,val);else printf("-1\n");}else if(c==4){scanf("%d%d",&x,&y);int tmp=LCA(x,y);if(tmp) printf("%d\n",AskMax(x,y));else printf("-1\n");}}printf("\n");}return 0;
}

动态树模板(HDU4010题)相关推荐

  1. Link-Cut Tree动态树模板

    讲解博客:https://www.cnblogs.com/zhoushuyu/p/8137553.html struct Link_Cut_Tree {int fa[N],ch[N][2],sum[N ...

  2. luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

    题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  3. hdu1156(简单线段树 模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. P4719 【模板】“动态 DP“动态树分治(矩阵/轻重链剖分/ddp)

    P4719 [模板]"动态 DP"&动态树分治 求解树上最大权独立集,但是需要支持修改. https://www.luogu.com.cn/problem/solution ...

  5. BZOJ2759 一个动态树好题

    题目 有\(N\)个未知数\(x[1..n]\)和\(N\)个等式组成的同余方程组: \(x[i]=k[i]*x[p[i]]+b[i] mod 10007\) 其中,\(k[i],b[i],x[i]∈ ...

  6. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  7. 线段树模板题3:区间染色问题

    1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...

  8. 试题 算法训练 操作格子(线段树模板题)

    资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3 ...

  9. J.哭泣的阿木木(线段树模板题)

    哭泣的阿木木 Description 没啥用的背景故事: 在远古的恕瑞玛,有一个孤独而又忧郁的灵魂,阿木木.他在世间游荡,只为找到一个朋友.他遭受了一种远古的巫术诅咒,注定忍受永世的孤单,因为被他触碰 ...

最新文章

  1. 【Java】5.1 类和对象
  2. Go语言的多态(Polymorphism)
  3. linux 系统下配置java环境变量
  4. teamviewer无法建立连接原因未知_3389远程无法连接的5种原因分析
  5. npm run dev时报错:Node Sass does not yet support../nodejs与node-sass版本冲突
  6. 在Linux中使用cURL进行HTTP POST和GET [复制]
  7. C++ 函数重载 参数默认值可以不写
  8. SCPM供应链管理专业证书知多少
  9. 2020上海大学生网络安全赛MISC题WP
  10. iOS load和initialize方法详解
  11. Easyx-----c语言实现图形化打砖块
  12. 给定一个完全循环赛的比赛结果,其中n个队伍两两比赛一次。每场比赛以一方胜出或者平局结束。设计一个算法,把n个队伍排序,序列中每个队伍都不曾输给紧随其后的那个队伍。说明该算法的时间效率类型。
  13. 苹果和华为鸿蒙,苹果的homeOSx和华为鸿蒙,两豪杰狭路相逢
  14. 如何判断自己是不是社恐?
  15. 看不到同一个网络下的其他计算机,局域网中看不到其他计算机怎么办
  16. jdbc不能识别别名_生命离开氧气就不能活了吗? 氢气告诉你,No~
  17. FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
  18. c语言作业 结构体,C语言之结构体练习题.doc
  19. winform ui 设计参考
  20. RxJava之一——一次性学会使用RxJava

热门文章

  1. flume的概述和运行机制
  2. 字节输入流_InputStream类FileInputStream类介绍
  3. show status用法
  4. 循环计算-02-0到100数字累加
  5. oracle11 不更新记录,oracle11g 使用first_value获取表中不连接的ID号及掉失记录数量...
  6. Java中头指针和头结点_. 2 . 【严题集 2.1① 描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。...
  7. pip install python -32_pip安装python模块方法
  8. 网络套接字(Network socket)
  9. PostgreSQL 与 MySQL 常用命令对照
  10. Jenkins + Gitlab + Ansible--playbook 代码上线流程