【题目描述】
SPOJ - QTREE3Query on a tree again!

【题目分析】
题目要求是输出从111到xxx的路径上遇到的第一个黑色的点。我们可以用树链剖分(不了解的同学请出门左拐,详见树链剖分入门)
我们用线段树维护每个区间第一次遇到黑点的位置,这样访问出的点同样是从1开始路径上的第一个点。因为我们总是从根节点1开始,我们在访问的时候从后往前每次访问重链时在线段树上都是一段连续的区间,因此在映射数组的位置越靠前则在路径上越靠前
【AC代码】

#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<climits>using namespace std;const int MAXN=100005;
vector<int>g[MAXN];
int fa[MAXN],A[MAXN],color[MAXN],pos[MAXN],siz[MAXN],son[MAXN],h[MAXN],top[MAXN],re[MAXN];
int cnt=0,n,m;
int Min[MAXN<<2];void dfs1(int u,int f)
{int i,v;siz[u]=1;son[u]=0;fa[u]=f;h[u]=h[f]+1;for(i=0;i<g[u].size();i++){v=g[u][i];if(v!=f){dfs1(v,u);siz[u]+=siz[v];if(siz[son[u]]<siz[v]) son[u]=v;}}
}
void dfs2(int u,int f,int k)
{int i,v;top[u]=k;pos[u]=++cnt;re[cnt]=u;//A[cnt]=INT_MAX;if(son[u]) dfs2(son[u],u,k);for(i=0;i<g[u].size();i++){v=g[u][i];if(v!=f&&v!=son[u]) dfs2(v,u,v);}
}void build(int k,int l,int r)
{if(l==r){Min[k]=INT_MAX;return; }int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);Min[k]=min(Min[k<<1],Min[k<<1|1]);
}void update(int k,int l,int r,int x,int color)
{if(l==r){if(color==1)Min[k]=l;elseMin[k]=INT_MAX;return;}int mid=(l+r)/2;if(x<=mid) update(k<<1,l,mid,x,color);else update(k<<1|1,mid+1,r,x,color);Min[k]=min(Min[k<<1],Min[k<<1|1]);
}int QueryMin(int k,int l,int r,int L,int R)
{if(L<=l && r<=R) return Min[k];int mid=(l+r)/2;int ret=INT_MAX;if(L<=mid) ret=min(ret,QueryMin(k<<1,l,mid,L,R));if(R>mid) ret=min(ret,QueryMin(k<<1|1,mid+1,r,L,R));return ret;
}int FindMin(int u)
{int ans=INT_MAX;while(top[u]!=1){ans=min(ans,QueryMin(1,1,n,pos[top[u]],pos[u]));u=fa[top[u]];}ans=min(ans,QueryMin(1,1,n,1,pos[u]));return ans;
}int main()
{int a,b,r,l,mid,ans;memset(A,0,sizeof(A));memset(color,0,sizeof(color));scanf("%d%d",&n,&m);for(int i=1;i<n;i++){scanf("%d%d",&a,&b);g[a].push_back(b);g[b].push_back(a);}dfs1(1,0);dfs2(1,0,1);build(1,1,n);while(m--){scanf("%d%d",&a,&b);if(a==0) {color[b]=!color[b];update(1,1,n,pos[b],color[b]);}else{ans=FindMin(b);if(ans==INT_MAX){printf("-1\n");}else{printf("%d\n",re[ans]);    //维护的是在映射数组上的下标,应该用一个数组保存从下标到节点的映射}}}return 0;
}

SPOJ - QTREE3Query on a tree again!——树链剖分相关推荐

  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. spoj 375 Query on a tree (树链剖分)

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

  3. POJ 3237 Tree (树链剖分)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 2825   Accepted: 769 Description ...

  4. [SPOJ375]QTREE - Query on a tree【树链剖分】

    题目描述 给你一棵树,两种操作. 修改边权,查找边权的最大值. 分析 我们都知道,树链剖分能够维护点权. 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上. 注意,lca的 ...

  5. HDU 5274 Dylans loves tree(树链剖分)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5274 [题目大意] 给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数 ...

  6. E. Jamie and Tree(树链剖分 + 线段树)

    E. Jamie and Tree 思路 直接root=vroot = vroot=v: 找lcalcalca,lca=lca(root,u),lca(root,v),lca(u,v)lca = {l ...

  7. 【BZOJ4353】Play with tree,树链剖分线段树

    传送门 思路: 毒瘤数据结构 维护区间最小值及个数,区间0的个数 标记分为覆盖标记和增值标记 1操作直接覆盖 2操作取路径最小值,再判断增值 边链剖注意减去1节点的贡献 细节太多全靠自己 我反正是写了 ...

  8. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

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

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

最新文章

  1. MySQL Date,DateTime和Timestamp类型
  2. Linux I2C子系统分析-I2C总线驱动
  3. aix 7 oracle 10g,在64位aix上安装oracle10g
  4. codeforces 96A-C语言解题报告
  5. 计算机博士美国学校推荐,留学随笔:一位计算机博士留学美国的感悟
  6. Vue.js 牛刀小试(持续更新~~~)
  7. 大数据城市规划 杨东_AI为智慧城市规划做建设
  8. skywalking前端_skywalking实现分布式系统链路追踪
  9. 使用java程序读取配置文件中的相关属性值-asp.net关注
  10. Biorhythms 中国剩余定理
  11. 在ASP.NET 2.0中直接得到本页面生成的HTML代码(转自孟宪会之精彩世界)
  12. Windows与Linux配置jco3
  13. linux驱动程序的测试,Linux驱动学习笔记(4)字符设备驱动测试
  14. Excel数据分列大法总结
  15. leetcode (Arranging Coins)
  16. PRD是什么?PRD如何写?
  17. Appium-desktop的下载安装
  18. 诺奖得主涉嫌学术造假!30多篇论文被曝P图、复制粘贴,牵扯中科大教授等多国学者
  19. 平安夜,还做那只「花好夜猿」吗?
  20. windows外壳公用dll已停止工作

热门文章

  1. [cdq分治][树状数组] Jzoj P4419 hole
  2. PhiloGL学习(5)——神说要有光,便有了光
  3. [蓝桥杯历届试题] 欧拉与鸡蛋
  4. 小白学数据分析-----留存率分析_I[次日留存率突然下降了50%?]
  5. 鸿蒙3部曲先看哪部,讨论雪鹰与鸿蒙三部曲的关系
  6. 爱课程c语言函数2的作业答案,C语言程序设计
  7. html vbs 输入框,HTML_vbs实现的下拉框对应键入值,vbs实现的下拉框对应键入值 - phpStudy...
  8. vue 固定div 滚动_vue.js-div滚动条隐藏但有滚动效果的实现方法
  9. 克隆安装oracle,Oracle 之 Cloning $oracle_home (克隆安装oracle软件)
  10. centos 打开pdo_mysql_centos中添加php扩展pdo_mysql步骤