Qtree3 - 树链剖分
打完以后才发现写复杂了……算了懒得改了
#include <bits/stdc++.h>
using namespace std; int dep[],fa[][],size[],wson[],vis[],sid[],tid[];
int n,m,t1,t2,t3,t4,ind,top[],a[]; vector <int> g[]; void dfs1(int p) {
size[p]=;
vis[p]=;
for(int i=;i<g[p].size();i++) {
if(vis[g[p][i]]) continue;
dep[g[p][i]]=dep[p]+;
fa[g[p][i]][]=p;
dfs1(g[p][i]);
size[p]+=size[g[p][i]];
if(size[g[p][i]]>size[wson[p]]) wson[p]=g[p][i];
}
} void dfs2(int p) {
vis[p]=;
sid[p]=++ind;
tid[ind]=p;
if(wson[p]) {
top[wson[p]]=top[p];
dfs2(wson[p]);
}
for(int i=;i<g[p].size();i++) {
if(vis[g[p][i]]) continue;
top[g[p][i]]=g[p][i];
dfs2(g[p][i]);
}
} void lca_presolve() {
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
} int lca(int p,int q) {
if(dep[p]<dep[q]) swap(p,q);
for(int i=;i>=;i--) if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
for(int i=;i>=;i--) if(fa[p][i]-fa[q][i]) p=fa[p][i], q=fa[q][i];
if(p-q) p=fa[p][], q=fa[q][];
return max(p,q);
} void pushup(int p){
if(a[p*]) a[p]=a[p*];
else a[p]=a[p*+];
} void modify(int p,int l,int r,int pos) {
if(l==r) {
a[p]=a[p]?:l;
return;
}
if(pos<=(l+r)/) modify(p*,l,(l+r)/,pos);
else modify(p*+,(l+r)/+,r,pos);
pushup(p);
} int query(int p,int l,int r,int ql,int qr) {
if(l>qr||r<ql) return ;
if(l>=ql&&r<=qr) return a[p];
int q0=query(p*,l,(l+r)/,ql,qr);
if(q0) return q0;
else return query(p*+,(l+r)/+,r,ql,qr);
} void tmodify(int pos) {
modify(,,n,sid[pos]);
} int lquery_upward(int anc,int son) {
int ans=;
while(dep[top[son]]>dep[anc]) {
ans=query(,,n,sid[top[son]],sid[son]);
son=fa[top[son]][];
if(ans) return ans;
}
return query(,,n,sid[anc],sid[son]);
} int lquery_downward(int anc,int son) {
int ans=,tmp;
while(dep[top[son]]>dep[anc]) {
tmp=query(,,n,sid[top[son]],sid[son]);
if(tmp) ans=tmp;
son=fa[top[son]][];
}
tmp=query(,,n,sid[anc],sid[son]);
if(tmp) ans=tmp;
return ans;
} int tquery(int p,int q){
int l=lca(p,q),tmp;
tmp=lquery_upward(l,p);
if(tmp) return tmp;
else return lquery_downward(l,q);
} int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<n;i++) cin>>t1>>t2, g[t1].push_back(t2), g[t2].push_back(t1);
dep[]=; dfs1();
memset(vis,,sizeof vis);
dfs2();
lca_presolve(); for(int i=;i<=m;i++) {
cin>>t1>>t2;
if(t1==) tmodify(t2);
else t3=tid[tquery(,t2)], cout<<(t3==?-:t3)<<endl;
}
}
Qtree3 - 树链剖分的更多相关文章
- 树链剖分&咕咕咕了好久好久的qtree3
前言 显然qtree系列都是树链剖分辣 发现自己没有专门整理过树链剖分耶 辣么就把这篇博客魔改成树链剖分好辣(貌似除了树剖也没什么好写的) 正文 废话了辣么多终于开始了 一.树剖怎么写鸭 二.树剖有什 ...
- QTREE3 spoj 2798. Query on a tree again! 树链剖分+线段树
Query on a tree again! 给出一棵树,树节点的颜色初始时为白色,有两种操作: 0.把节点x的颜色置反(黑变白,白变黑). 1.询问节点1到节点x的路径上第一个黑色节点的编号. 分析 ...
- Qtree3题解(树链剖分(伪)+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...
- Qtree3题解(树链剖分+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...
- 树链剖分【p4116】Qtree3 - Query on a tree
Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...
- 【SPOJ-QTREE3】树链剖分
http://www.spoj.com/problems/QTREE3/ 时间限制:2s 代码长度限制:50000B 内存限制:1536MB [题目描述] 给出N个点的一棵树(N-1条边 ...
- 【模板时间】◆模板·II◆ 树链剖分
[模板·II]树链剖分 学长给我讲树链剖分,然而我并没有听懂,还是自学有用……另外感谢一篇Blog +by 自为风月马前卒+ 一.算法简述 树链剖分可以将一棵普通的多叉树转为线段树计算,不但可以实现对 ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
随机推荐
- Kotlin Tutorials系列文章
Kotlin Tutorials系列文章 想写一个有实用价值的Kotlin笔记, 让一线开发一看就懂, 看完就能上手. 当然官方文档更有参考价值了. 这个系列相对于官方文档的大而全来说, 最主要优势是 ...
- POJ-2299 Ultra-QuickSort(用树状数组求逆序对数)
题目链接 ac代码 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...
- LeetCode 面试题24. 反转链表
题目链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/ 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. ...
- Asciidoctor-pdf生成pdf文件
本文使用asciidoc语法编写. = Asciidoctor-pdf生成pdf文件 Pinnsvin Pinnsvin@163.com v1.0 {docdate} :plantuml-server ...
- 【Spring】bean的作用域(@Scope) - singleton、prototype
已知spring 3+已拥有多种不同的作用域: singleton(默认).prototype.request.session.global session.(参考: spring中scope作用域( ...
- 【python基础语法】数据类型:数值、字符串 (第2天课堂笔记)
""" 数据类型: 一.数值类型:整数 浮点数 布尔值 二.序列类型:字符串.列表 元祖 三.散列类型:字典 集合 可变数据类型: 列表 字典 集合,可以改动内存地址数据 ...
- python + excel工资条自动生成
年终绩效分配结果出来了,领导要求每人要清楚地知道自己的情况.要求:总绩效和各分类都要清楚.这就表示我们要给每人六个纸条,一个总的,五个分的.打出来,裁开,分发给每个人!累死人.所以,我就想能否每人生成 ...
- Mybaits(10)N+1问题
N+1问题 从上面的例子日志中我们可以看到所有级联都成功了,但是引发了性能问题,例如我们在查询雇员的信息和工作任务信息,此时体检表和工牌信息就是多余,我们没必要查询一次.如果想日志体现的那样,取出了所 ...
- Projected coordinate systems 和 wkid
Projected coordinate systems Well-known ID Name Well-known text 2000 Anguilla_1957_British_West_Indi ...
- ex03
1. a heuristic function h(n): a heuristic value of n, that is the estimated cost of reaching goal fr ...