题意:给定一棵树,每个节点颜色是黑色或者是白色。初始时,全白。

定义两种操作

0 i 改变第i个节点

1 v 询问从1到v的路径上,第一个黑节点

  1 #include<iostream>  2 #include<cstring>  3 #include<cmath>  4 #include<cstdio>  5 using namespace std;  6 #define MAXN 100010  7 #define INF 987654321  8 struct node  9 { 10     int r; 11     node *next; 12 }; 13 struct tree_node 14 { 15     int left,right; 16     int num; 17 }; 18 node *graph[MAXN]; 19 node memo[MAXN*2]; 20 tree_node tree[4*MAXN]; 21 int d[MAXN],father[MAXN],line[MAXN],son[MAXN],top[MAXN],mark[MAXN],home[MAXN]; 22 int n,m,label,color[MAXN],etop; 23 void add(int x,int y) 24 { 25     node *p=&memo[etop++]; 26     p->r=y; p->next=graph[x]; graph[x]=p; 27     p=&memo[etop++]; 28     p->r=x; p->next=graph[y]; graph[y]=p; 29 } 30 int dfs1(int i,int deep,int fa) 31 { 32     d[i]=deep; father[i]=fa; 33     int size=1,maxsize=0,temp; 34     for(node *p=graph[i];p;p=p->next) 35     if(p->r!=father[i]) 36     { 37         temp=dfs1(p->r,deep+1,i); 38         if(temp>maxsize) 39         { 40             maxsize=temp; son[i]=p->r; 41         } 42         size+=temp; 43     } 44     return size; 45 } 46 void dfs2(int x,int y) 47 { 48     mark[x]=++label; top[x]=y; 49     home[label]=x; 50     if(son[x]==-1) return ; 51     dfs2(son[x],y); 52     for(node *p=graph[x];p;p=p->next) 53     if(p->r!=father[x]&&p->r!=son[x]) dfs2(p->r,p->r); 54 } 55 void build_tree(int i) 56 { 57     tree[i].num=INF; 58     if(tree[i].left==tree[i].right) return ; 59     int mid=(tree[i].left+tree[i].right)/2; 60     tree[2*i].left=tree[i].left; tree[2*i].right=mid; 61     tree[2*i+1].left=mid+1; tree[2*i+1].right=tree[i].right; 62     build_tree(2*i); build_tree(2*i+1); 63 } 64 void change(int i,int x) 65 { 66     if(tree[i].left==tree[i].right) 67     { 68         if(tree[i].num==INF) tree[i].num=tree[i].left; 69         else tree[i].num=INF; 70         return ; 71     } 72     int mid=(tree[i].left+tree[i].right)/2; 73     if(x<=mid) change(2*i,x); 74     else change(2*i+1,x); 75     tree[i].num=min(tree[2*i].num,tree[2*i+1].num); 76 } 77 int search(int i,int x,int y) 78 { 79     if(tree[i].left==x&&tree[i].right==y) 80         return tree[i].num; 81     int mid=(tree[i].left+tree[i].right)/2; 82     if(y<=mid) return search(2*i,x,y); 83     else if(x>mid) return search(2*i+1,x,y); 84     else return min(search(2*i,x,mid),search(2*i+1,mid+1,y)); 85 } 86 void build() 87 { 88     dfs1(1,1,-1); 89     dfs2(1,1); 90     tree[1].left=1; tree[1].right=n; 91     build_tree(1); 92 } 93  94  95 void solve() 96 { 97     int c,x,nx,ans; 98     for(int i=1;i<=m;i++) 99     {100         scanf("%d%d",&c,&x);101         if(c==0) change(1,mark[x]);102         else103         {104             for(ans=INF;x!=-1;x=father[nx])105             {106                 nx=top[x];107                 ans=min(ans,search(1,mark[nx],mark[x]));108             }109         if(ans==INF) printf("-1\n");110         else printf("%d\n",home[ans]);111         }112     }113 }114 int main()115 {116     scanf("%d%d",&n,&m);117     int x,y;118     int i;119     memset(graph,0,sizeof(graph));120     memset(son,0xff,sizeof(son));121     etop=label=0;122     for(i=1;i<n;i++)123     {124         scanf("%d%d",&x,&y);125         add(x,y);126     }127     build();128     solve();129     return 0;130 }

转载于:https://www.cnblogs.com/myoi/archive/2012/03/04/2379518.html

spoj 2798 Query 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. [SPOJ375]QTREE - Query on a tree【树链剖分】

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

  4. SPOJ - QTREE3Query on a tree again!——树链剖分

    [题目描述] SPOJ - QTREE3Query on a tree again! [题目分析] 题目要求是输出从111到xxx的路径上遇到的第一个黑色的点.我们可以用树链剖分(不了解的同学请出门左 ...

  5. POJ 3237 Tree (树链剖分)

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

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

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

  7. 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 ...

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

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

  9. bzoj2243 树链剖分

    https://www.lydsy.com/JudgeOnline/problem.php?id=2243 新学的树剖,在维护的时候线段树维护区间内颜色数量以及左右两端的颜色.统计的时候区间合并时判断 ...

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

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

最新文章

  1. BZOJ.3004.[SDOI2012]吊灯(结论)
  2. Novodex2.6.2 布料系统
  3. gpu的单位表示_GPU编程1--GPU中的基本概念
  4. .net get set 初始化_RAM初始化的下板验证(Xilinx)
  5. [原创]我的作品:我的迷宫小游戏Java版本
  6. 加载elementor时出现问题_不锈钢管在焊接时出现问题要怎么解决?
  7. 前端学习(2306):react之组件使用之图片使用
  8. 前端学习(670):分支流程控制if
  9. go语言快速刷《程序员面试金典》(2)
  10. Maven配置项目依赖使用本地仓库的方法汇总
  11. angularjs项目的页面跳转如何实现
  12. 游山玩水拈花惹草 --- SAP 顾问出差期间自娱自乐的妙招
  13. JVM01----JVM结构
  14. 乐鑫Esp32学习之旅30 对接华为IoT物联网平台适配踩坑,使用ESP-IDF 编程使用HTTPS请求固件跳过证书校验,实现OTA远程升级文件。(附带源码)
  15. hmssdk php,接入华为推送,开发流程, 与遇到的坑(PUSH SDK 和 HMS SDK)
  16. 计算机串口故障,电脑故障:主板串口接口故障的维修方法总结
  17. Nginx学习 ---- js胖笔记
  18. QQ升到9个太阳需要58年左右时间!
  19. 计算机打开服务的命令行,Win7使用命令行启动和停止Windows服务程序技巧
  20. 淘宝天猫店铺优惠券领取入口在哪里找到怎么领天猫淘宝店铺优惠券享受券后价优惠?

热门文章

  1. ChromeFFOpera下DIV不设置高度显示背景颜色和边框的办法
  2. hibernate和jpa连接mysql_Hibernate能够连接到mysql但Spring JPA却没有
  3. rz/sz安装与乱码问题
  4. 学校计算机房的占地面积是78,国内哪所国际高中好,可以考取美国大学
  5. Linux网络子系统中报文的接收及NAPI的实现
  6. double精度丢失问题
  7. python经典实例下载_python经典实例
  8. [渝粤教育] 四川大学 西方经济学(微观) 参考 资料
  9. 【渝粤教育】国家开放大学2018年春季 0284-21T外国文学 参考试题
  10. 瑞利衰落(Rayleigh Fading)