打完以后才发现写复杂了……算了懒得改了

 #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 - 树链剖分的更多相关文章

  1. 树链剖分&咕咕咕了好久好久的qtree3

    前言 显然qtree系列都是树链剖分辣 发现自己没有专门整理过树链剖分耶 辣么就把这篇博客魔改成树链剖分好辣(貌似除了树剖也没什么好写的) 正文 废话了辣么多终于开始了 一.树剖怎么写鸭 二.树剖有什 ...

  2. QTREE3 spoj 2798. Query on a tree again! 树链剖分+线段树

    Query on a tree again! 给出一棵树,树节点的颜色初始时为白色,有两种操作: 0.把节点x的颜色置反(黑变白,白变黑). 1.询问节点1到节点x的路径上第一个黑色节点的编号. 分析 ...

  3. Qtree3题解(树链剖分(伪)+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...

  4. Qtree3题解(树链剖分+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...

  5. 树链剖分【p4116】Qtree3 - Query on a tree

    Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...

  6. 【SPOJ-QTREE3】树链剖分

    http://www.spoj.com/problems/QTREE3/ 时间限制:2s    代码长度限制:50000B     内存限制:1536MB [题目描述] 给出N个点的一棵树(N-1条边 ...

  7. 【模板时间】◆模板·II◆ 树链剖分

    [模板·II]树链剖分 学长给我讲树链剖分,然而我并没有听懂,还是自学有用……另外感谢一篇Blog +by 自为风月马前卒+ 一.算法简述 树链剖分可以将一棵普通的多叉树转为线段树计算,不但可以实现对 ...

  8. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  9. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

随机推荐

  1. ASPNetCore 发布到IIS

    ASPNetCore 发布到IIS 准备工作 1.1.  安装IIS.(具体操作不再说明) 安装成功后再浏览器输入localhost得到的页面如下 1.2.  安装dotnet-hosting-2.2 ...

  2. 想学大学计算机课?这 37 门 CS 专业必修课,了解一下

    最近,不少高校延迟开学,大家只能宅家上网课. 有一些朋友,想趁此期间,多学点计算机的专业课,却不知从何学起. 211,985大学的计算机专业课都是经过授课教师精心安排的,从大一到大四,课程合理设置,循 ...

  3. Android中点击按钮获取string.xml中内容并弹窗提示

    场景 AndroidStudio跑起来第一个App时新手遇到的那些坑: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103797 ...

  4. redis中key键操作

    keys */查看所有的key remoteSelf:1>select 0 "OK" remoteSelf:0>keys * 1) "SUBCRIBEMAP& ...

  5. leetcode-简单-栈-有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足:  左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被 ...

  6. Python 使用OS模块调用 cmd

    在os模块中提供了两种调用 cmd 的方法,os.popen() 和 os.system()os.system(cmd) 是在执行command命令时需要打开一个终端,并且无法保存command命令的 ...

  7. 通过sql的stuff 把一列几行的记录拼接在一行一个字段

    ---通过sql的stuff 把一列几行的记录拼接在一行一个字段 select FID,a.FCustomerID as 工地ID , 应验收节点 = (stuff((select ',' + isn ...

  8. 折腾vue--使用vscode创建vue项目(二)

    1.安装webpack npm install -g webpack 2.安装sass npm install --save-dev sass-loader npm install --save-de ...

  9. jQuery---on注册事件的2种方式

    on注册事件的2种方式 on注册事件的语法 on注册简单事件 // 这个是p自己注册的事件(简单事件) $("p").on("click", function ...

  10. Origin-作图相关

    1.跨越缺失数据连接直线