查询树上某个节点的子节点的标号小于其标号的数目. 一个trick是建立线段树之后,从标号小的向标号大的来做更新.

   1:  #include <cstdio>
   2:  #include <cstring>
   3:  #include <cctype>
   4:  #include <algorithm>
   5:  #include <vector>
   6:  #include <iostream>
   7:  using namespace std;
   8:  #pragma comment(linker, "/STACK:1024000000,1024000000")
   9:  #define LL(a)   a<<1
  10:  #define RR(a)   a<<1|1
  11:   
  12:  const int MaxL = 200030;
  13:   
  14:  int pre[MaxL];  // first travel
  15:  int nxt[MaxL];  // nxt travel
  16:  int f[MaxL];
  17:  bool vis[MaxL];
  18:  int N;
  19:  vector<vector<int> > E(MaxL);
  20:   
  21:  struct Seg_tree
  22:  {
  23:      int left, right;
  24:      int sum;
  25:  } tt[MaxL<<2];
  26:   
  27:   
  28:  void PushUp(int idx)
  29:  {
  30:      tt[idx].sum = tt[LL(idx)].sum + tt[RR(idx)].sum;
  31:  }
  32:   
  33:  void build(int l,int r,int idx)
  34:  {
  35:      tt[idx].left = l, tt[idx].right = r;
  36:      tt[idx].sum = 0;
  37:      if (l == r) return ;
  38:      int m = (l + r) >> 1;
  39:      build(l,m, LL(idx));
  40:      build(m+1, r, RR(idx));
  41:  }
  42:   
  43:  void update(int p, int idx = 1)
  44:  {
  45:      if(p == tt[idx].left && p == tt[idx].right)
  46:      {
  47:          tt[idx].sum =1;
  48:          return ;
  49:      }
  50:      int mid = (tt[idx].left + tt[idx].right)>>1;
  51:      if(p <= mid) update(p, LL(idx));
  52:      else update(p, RR(idx));
  53:      PushUp(idx);
  54:  }
  55:   
  56:  int query(int l, int r, int idx = 1)
  57:  {
  58:      if(l == tt[idx].left && r ==tt[idx].right)
  59:          return tt[idx].sum;
  60:      int mid = (tt[idx].left + tt[idx].right)>>1;
  61:      if(r <= mid) return query(l,r, LL(idx));
  62:      else if(l> mid) return query(l,r, RR(idx));
  63:      else
  64:          return query(l, mid, LL(idx))+ query(mid+1, r, RR(idx));
  65:  }
  66:   
  67:  int mark = 1;
  68:  void dfs( int a)
  69:  {
  70:      vis[a] = 1;
  71:      pre[a] = mark++;
  72:      for(int i=0; i<E[a].size(); i++)
  73:      {
  74:          if(!vis[E[a][i]])
  75:              dfs(E[a][i]);
  76:      }
  77:      nxt[a] = mark++;
  78:  }
  79:   
  80:  int main()
  81:  {
  82:  //    freopen("1.txt","r",stdin);
  83:      int p;
  84:      while( scanf("%d%d", &N, &p) && N!=0 && p!=0)
  85:      {
  86:          memset(pre, 0, sizeof(pre));
  87:          memset(nxt, 0 ,sizeof(nxt));
  88:          memset(vis, 0 ,sizeof(vis));
  89:          for(int i=1; i<=N; i++) E[i].clear();
  90:   
  91:          for(int i=1; i<N; i++)
  92:          {
  93:              int a,b;
  94:              scanf("%d%d", &a,&b);
  95:              E[a].push_back(b);
  96:              E[b].push_back(a);
  97:          }
  98:          mark = 1;
  99:          dfs(p);
 100:          build(1, 2*N, 1);
 101:          for(int i=1; i<=N; i++)
 102:          {
 103:              f[i] =query(pre[i], nxt[i],1);
 104:              update(pre[i],1);
 105:          }
 106:          for(int i=1; i<N; i++)
 107:              printf("%d ",f[i]);
 108:          printf("%d\n",f[N]);
 109:      }
 110:      return 0;
 111:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

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

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

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

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

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

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

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

  5. POJ 3321 DFS序+线段树

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

  6. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  7. F - Change FZU - 2277 (DFS序+线段树)

    题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...

  8. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  9. BZOJ1103 [POI2007]大都市meg dfs序 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...

随机推荐

  1. 1172 Hankson 的趣味题[数论]

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descrip ...

  2. 解决 arcGis android TextSymbol乱码的问题

    不论是Arcgis for Android的哪个版本,都没无法解决中文乱码的问题,这个与Android中自带的字体库有关,可以参考这篇文章. 所以,要在Arcgis for Android中显示中文, ...

  3. Android 混淆与混淆过滤

    Android 中代码混淆一般用的是ProGuard.它除了混淆代码之后还有其它许多实用的功能.这里主要记录混淆相关的实现. 1.ProGuard的作用 删除无用代码,压缩和优化Class文件,缩小A ...

  4. Part 6 AngularJS ng repeat directive

    ng-repeat is similar to foreach loop in C#. Let us understand this with an example. Here is what we ...

  5. jQuery 删除或是清空某个HTML元素示例

    jQuery使用下面两个方法来删除或是清空某个HTML元素. remove() – 删除指定的元素(包括其子元素)empty() – 清空指定元素的子元素 1.remove()  <!DOCTY ...

  6. 读书笔记-常用设计模式之MVC

    1.MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在SmallTalk语言中.MVC模式是一种复合设计模式,由“观察者”(Observ ...

  7. c# SQL CLR 之一

    CLR就是公共运行时,本文就对c#编写SQL StoredProcedures的过程进行简单讲解. [步骤] 2. 3. 7.打开设置 8. 注意删除方式:注意删除Assembly时,一定要先把引用此 ...

  8. 怎样把function中的arguments变成普通数组

    当我们在写一个具有处理可变长度参数的函数时,需要对arguments做一些操作.但是arguments它并不是一个数组,没有数组的各种操作,而且,JS的严格模式中不允许更改它的值. 这时我们需要将它的 ...

  9. 10款基于jquery的web前端特效及源码下载

    1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...

  10. 推荐7款新鲜出炉的HTML5/CSS3应用

    1.HTML5/CSS3发光文字可自定义文字色彩效果很赞 要分享的这款HTML5/CSS3文字效果很帅,鼠标滑过文字时,文字会出现发光的特效,并且我们可以自定义文字和颜色. 在线演示 源码下载 2.H ...