非递归的DFS写炸了… 交了一个递归版的 过了………..

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int N=1000050;
  7. int n,nn,q,xx,yy,stk[N],in[N],out[N],top,cnt,tree[N*4];
  8. int first[N],next[N],v[N],tot,num[N],vis[N],fa[N/2][21];
  9. char ch[5];
  10. struct Node{int deep,id;}node[N];
  11. bool cmpdeep(Node a,Node b){return a.deep<b.deep;}
  12. bool cmpid(Node a,Node b){return a.id<b.id;}
  13. void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
  14. void insert(int l,int r,int pos,int id,int w){
  15. if(l==r){tree[pos]=w;return;}
  16. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  17. if(mid<id)insert(mid+1,r,rson,id,w);
  18. else insert(l,mid,lson,id,w);
  19. tree[pos]=tree[lson]^tree[rson];
  20. }
  21. int query(int l,int r,int pos,int L,int R){
  22. if(l>=L&&r<=R)return tree[pos];
  23. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  24. if(mid<L)return query(mid+1,r,rson,L,R);
  25. else if(mid>=R)return query(l,mid,lson,L,R);
  26. else return query(l,mid,lson,L,R)^query(mid+1,r,rson,L,R);
  27. }
  28. int lca(int x,int y){
  29. if(node[x].deep<node[y].deep)swap(x,y);
  30. for(int i=20;~i;i--)if(node[x].deep-(1<<i)>=node[y].deep)x=fa[x][i];
  31. if(x==y)return x;
  32. for(int i=20;~i;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
  33. return fa[x][0];
  34. }
  35. void dfs(int x){
  36. in[x]=++cnt,insert(0,nn,1,cnt,num[x]);
  37. for(int i=first[x];~i;i=next[i])if(!vis[v[i]]){
  38. vis[v[i]]=1,node[v[i]].deep=node[x].deep+1;
  39. fa[v[i]][0]=x;
  40. dfs(v[i]);
  41. }
  42. out[x]=++cnt,insert(0,nn,1,cnt,num[x]);
  43. }
  44. int main(){
  45. memset(first,-1,sizeof(first)),vis[1]=1;
  46. scanf("%d",&n),nn=n*2;
  47. for(int i=1;i<=n;i++)scanf("%d",&num[i]),node[i].id=i;
  48. for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
  49. node[1].deep=vis[1]=1;
  50. dfs(1);
  51. sort(node+1,node+1+n,cmpdeep);
  52. for(int i=1;i<=n;i++)
  53. for(int j=1;j<=20;j++)
  54. fa[node[i].id][j]=fa[fa[node[i].id][j-1]][j-1];
  55. sort(node+1,node+1+n,cmpid);
  56. scanf("%d",&q);
  57. for(int i=1;i<=q;i++){
  58. scanf("%s",ch);
  59. if(ch[0]=='Q'){
  60. scanf("%d%d",&xx,&yy);
  61. puts(query(0,nn,1,0,in[xx])^query(0,nn,1,0,in[yy])^num[lca(xx,yy)]?"Yes":"No");
  62. }
  63. else{
  64. scanf("%d%d",&xx,&yy),num[xx]=yy;
  65. insert(0,nn,1,in[xx],yy),insert(0,nn,1,out[xx],yy);
  66. }
  67. }
  68. }

BZOJ 2819 DFS序+线段树的更多相关文章

  1. bzoj 4034(DFS序+线段树)

    这个题多了一个操作难度直线上升,看完题解才会写 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 ...

  2. BZOJ 1103 DFS序+线段树

    思路: 先搞出来DFS序 进入这个点 +1 出这个点 -1 线段树维护前缀和 (因为还要修改) 搞定 修改的时候只修改底下节点就OK了 (边权–>点权 不多说) //By SiriusRen # ...

  3. DFS序+线段树(bzoj 4034)

    题目链接 题目就不多说了. 本题目,可以用dfs序+线段树做:题目给定了一棵树,树上节点告诉了权值.我们可以先将这棵树进行dfs将一棵树变成线性结构:如图 变成这样后,然后就可以用线段树. 操作1:也 ...

  4. BZOJ 3252题解(贪心+dfs序+线段树)

    题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...

  5. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  6. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  7. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  8. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

    题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...

  9. POJ 3321 DFS序+线段树

    单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护. 1: /* 2: DFS序 +线段树 3: */ 4:   5: #include < ...

随机推荐

  1. javascript中构造函数的三种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. params可变参数、SqlCommand.Parameters.add()方法

    namespace params可变参数{ class Program { static void Main(string[] args) { int[] num = {66,99,55,44, }; ...

  3. Absolute Horizontal And Vertical Centering In CSS

    Quick CSS Trick: How To Center an Object Exactly In The Center Centering in CSS: A Complete Guide Ab ...

  4. 3D特征:关于HFM和HBB

    1.HBB    三维绑定框 (1): 要用到HBB,定义还不太清楚,来自于 VALVE Developer Community (https://developer.valvesoftware.co ...

  5. MFC多标签页对话框

    原文链接(有修改):http://blog.sina.com.cn/s/blog_6a1cdb3f0101llcw.html 1.新建一个MFC工程 取名PageSheet,选择Dialog base ...

  6. 基于Nginx的SSL虚拟主机

    通过私钥,证书对站点www.test.com的所有数据加密,实现通过https访问www.test.com 环境说明: 源码安装Nginx时必须使用--with-http_ssl_module参数,启 ...

  7. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  8. python tips:类的动态绑定

    使用实例引用类的属性时,会发生动态绑定.即python会在实例每次引用类属性时,将对应的类属性绑定到实例上. 动态绑定的例子: class A: def test1(self): print(&quo ...

  9. centos7的编译安装php5.3 (针对老系统必须安装php5.3才能运行)

    大家都知道,centos6以上yum都自带5.4以上的php版本,可是一些老系统必须安装 php-5.3该怎么办呢.下面我来教大家一步步编译安装.看看我踩过的坑. 第一步: 网上下载php5.3的源码 ...

  10. maven构建本地jar包到本地仓库

    maven命令: mvn:install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=1.0 -Dpackaging ...