题意:

给一棵\(n(1 \leq n \leq 10^5)\)个节点的二叉树,除叶子节点外,每个点都有左儿子和右儿子。

每个点上都有一个权值。

游戏规则是这样的:在根节点放一个权值为\(X\)的小球,假设当前节点的权值是\(w_i\)

  • 如果\(X=w_i\),小球就停在这个节点。
  • 如果\(X<w_i\),小球等概率地往左右两个儿子走下去。
  • 如果\(X>w_i\),小球以\(\frac{1}{8}\)的概率走到左儿子,以\(\frac{7}{8}\)的概率走到右儿子。

下面有若干次询问\(v \, X\),问从根节点放一个权值为\(X\)的小球走到节点\(v\)的概率是多少。

分析:

构造一棵主席树,维护父亲权值在区间\([L,R]\)中左儿子和右儿子的个数。

首先判断一下概率为\(0\)的情况,如果找到父亲权值等于小球权值\(X\)的点,那么概率为\(0\)。

否则就统计一下父亲权值小于\(X\)的左儿子个数\(lcnt\),右儿子个数\(rcnt\),以及所有的儿子个数\(sons\)。

所求的概率为:\(p=\frac{1^{lcnt} \cdot 7^{rcnt} \cdot 4^{sons-lcnt-rcnt}}{8}\)

解得\(x=rcnt, \, y=sons+lcnt+rcnt\)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 100000 + 10;
  6. const int maxnode = maxn << 5;
  7. struct Node
  8. {
  9. int lcnt, rcnt;
  10. Node(int l = 0, int r = 0): lcnt(l), rcnt(r) {}
  11. Node operator + (const Node& t) const {
  12. return Node(lcnt + t.lcnt, rcnt + t.rcnt);
  13. }
  14. };
  15. int sz;
  16. Node T[maxnode];
  17. int lch[maxnode], rch[maxnode];
  18. int root[maxn];
  19. int update(int pre, int L, int R, int pos, Node t) {
  20. int rt = ++sz;
  21. T[rt] = T[pre] + t;
  22. lch[rt] = lch[pre];
  23. rch[rt] = rch[pre];
  24. if(L < R) {
  25. int M = (L + R) / 2;
  26. if(pos <= M) lch[rt] = update(lch[pre], L, M, pos, t);
  27. else rch[rt] = update(rch[pre], M+1, R, pos, t);
  28. }
  29. return rt;
  30. }
  31. int n, m, Q;
  32. int a[maxn], b[maxn * 2], tot;
  33. int v[maxn], x[maxn];
  34. int ch[maxn][2];
  35. int dep[maxn];
  36. void dfs(int u) {
  37. if(!ch[u][0]) return;
  38. root[ch[u][0]] = update(root[u], 1, tot, a[u], Node(1, 0));
  39. root[ch[u][1]] = update(root[u], 1, tot, a[u], Node(0, 1));
  40. dep[ch[u][0]] = dep[ch[u][1]] = dep[u] + 1;
  41. dfs(ch[u][0]);
  42. dfs(ch[u][1]);
  43. }
  44. bool queryequal(int rt, int L, int R, int pos) {
  45. if(L == R) { return T[rt].lcnt + T[rt].rcnt != 0; }
  46. int M = (L + R) / 2;
  47. if(pos <= M) return queryequal(lch[rt], L, M, pos);
  48. else return queryequal(rch[rt], M+1, R, pos);
  49. }
  50. Node queryless(int rt, int L, int R, int pos) {
  51. if(R <= pos) return T[rt];
  52. int M = (L + R) / 2;
  53. if(pos <= M) return queryless(lch[rt], L, M, pos);
  54. else return T[lch[rt]] + queryless(rch[rt], M+1, R, pos);
  55. }
  56. int main()
  57. {
  58. int _; scanf("%d", &_);
  59. while(_--) {
  60. int n; scanf("%d", &n);
  61. for(int i = 1; i <= n; i++) {
  62. scanf("%d", a + i);
  63. b[i - 1] = a[i];
  64. }
  65. scanf("%d", &m);
  66. memset(ch, 0, sizeof(ch));
  67. while(m--) {
  68. int u; scanf("%d", &u);
  69. scanf("%d%d", &ch[u][0], &ch[u][1]);
  70. }
  71. scanf("%d", &Q);
  72. tot = n;
  73. for(int i = 1; i <= Q; i++) {
  74. scanf("%d%d", v + i, x + i);
  75. b[tot++] = x[i];
  76. }
  77. sort(b, b + tot);
  78. tot = unique(b, b + tot) - b;
  79. for(int i = 1; i <= n; i++)
  80. a[i] = lower_bound(b, b + tot, a[i]) - b + 1;
  81. for(int i = 1; i <= Q; i++)
  82. x[i] = lower_bound(b, b + tot, x[i]) - b + 1;
  83. sz = 0;
  84. dfs(1);
  85. for(int i = 1; i <= Q; i++) {
  86. if(queryequal(root[v[i]], 1, tot, x[i])) {
  87. printf("0\n"); continue;
  88. }
  89. Node ans;
  90. if(x[i] > 1) ans = queryless(root[v[i]], 1, tot, x[i] - 1);
  91. int sons = dep[v[i]];
  92. int ans2 = sons * 3;
  93. ans2 -= (sons - ans.lcnt - ans.rcnt) * 2;
  94. int ans7 = ans.rcnt;
  95. printf("%d %d\n", ans7, ans2);
  96. }
  97. }
  98. return 0;
  99. }

HDU 4605 Magic Ball Game 主席树的更多相关文章

  1. HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一棵二叉树,每个结点孩子数目为0或者2. ...

  2. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  3. HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. hdu 4605 Magic Ball Game

    http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball  放在一个数组里(去重),从小到大排列 先不考虑特殊 ...

  5. HDU 4605 Magic Ball Game (dfs+离线树状数组)

    题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...

  6. HDU 4605 Magic Ball Game 树状数组

    题目大意很简单. 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点.然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走. 每碰到一个结点,有三种情况 如果 ...

  7. HDU 4605 Magic Ball Game(离线算法)

    题目链接 思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了. #pragma comment(linker, "/STACK:1 ...

  8. HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. cas实现单点登录原理

    1.基于Cookie的单点登录的回顾        基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从 ...

  2. python3 socke 服务端与客户端实现(回炉)

    #服务端#!/usr/bin/env python3 # -*- coding:utf-8 -*- from socket import * # 创建socket tcpSerSocket = soc ...

  3. 升级CentOS内核 - 2.6升级到3.10/最新内核

    ##记得切换到root用户执行升级操作. [root@localhost ~]# uname -a ##旧版 Linux localhost.localdomain 2.6.32-279.el6.i6 ...

  4. SqlServer 填充因子的说明

    CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfactor=30 使用 fill factor 选项可以指定 M ...

  5. SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题

    转自  :SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题 问题: 1. System.Data.SqlClient.SqlExcepti ...

  6. codeforecs Gym 100286B Blind Walk

    交互式程序,要用到一个函数fflush,它的作用是对标准输出流的清理,对stdout来说是及时地打印数据到屏幕上,一个事实:标准输出是以『行』为单位进行的,也即碰到\n才打印数据到屏幕.这就可能造成延 ...

  7. HDU 5097 Page Rank (模拟)

    题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明. 背后的原理是矩阵和图论.这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的. 如果一个网页被 ...

  8. python_107_ __metaclass__ 元类

    类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象? 答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __met ...

  9. angular设置反向代理

    本地调试,需要用到服务器的api,发现chrome安全问题,需要解决跨域问题.现给出解决方案: 1.增加proxy.conf.json文件 位置与package.json文件同级(可指定) 2.pac ...

  10. SQL 隔离级别

    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 简单的介绍四种隔离级别 ...