//给一棵树。树的每个节点的子节点个数是0或2
//对于每个节点都有一个权值w[i]
//一个权值为x的球在每个节点的情况有
//x=w[i] 这个球在该点不向下掉
//x<w[i] 这个球往左节点和右节点掉的概率各为1/2
//x>w[i] 这个球往左节点掉的概率为1/8 , 往右掉的概率为7/8
//问对于每个权值为x其掉到节点为v的概率

//对于一颗树从一点到还有一点的路径是确定的,仅仅须要记录这条路径中
//往左走的路径中大于x的节点个数 l_grt,小于x的节点个数l_less
//往右走中大于x的节点个数 r_grt , 小于x的节点个数r_less
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std ;
const int maxn = 1e6+10 ;
int map[maxn][2] ;
vector<int> vec[maxn] ;
int x[maxn] , y[maxn] ;
int root[maxn] ;
int w_x[maxn] ;
int  w[maxn] ;
int a[maxn] ;int len ;
int tree[2][maxn] ;
void update(int x , int flag , int dx)
{
    while(x < maxn)
    {
        tree[flag][x] += dx ;
        x += x&(-x) ;
    }
}
int getsum(int x ,int flag)
{
    int sum = 0 ;
    while(x)
    {
        sum += tree[flag][x] ;
        x -= x&(-x) ;
    }
    return sum ;
}
void dfs(int u)
{
    //cout<<u<<endl;
    for(int i = 0;i < vec[u].size() ;i++)
    {
        int id = vec[u][i] ;
        int pos = lower_bound(a, a + len - 1, w_x[id]) - a + 1;
        int l_less = getsum(pos - 1 , 0) ;
        int r_less = getsum(pos - 1, 1) ;
        int l_all = getsum(len , 0) ;
        int r_all = getsum(len , 1) ;
        int l_grt = l_all - getsum(pos , 0) ;
        int r_grt = r_all - getsum(pos , 1) ;
        if(l_less + r_less + l_grt + r_grt != l_all + r_all)
        {
            x[id] = y[id] = -1 ;
            continue ;
        }
        x[id] = r_less ;
        y[id] = l_grt + r_grt + (l_less + r_less)*3 ;
    }
    for(int i = 0;i < 2;i++)
    {
        if(!map[u][i])continue ;
        int v = map[u][i] ;
        int pos = lower_bound(a , a + len - 1 , w[u]) - a + 1 ;
        update(pos , i , 1) ;
        dfs(v) ;
        update(pos , i , -1) ;
    }
}
int main()
{
    //freopen("in.txt" ,"r" , stdin) ;
    int T ;
    int N ;int M , Q ;
    scanf("%d" , &T) ;
    while(T--)
    {
        scanf("%d" , &N) ;
        len = 0 ;
        for(int i = 1;i <= N;i++)
        {
            scanf("%d" , &w[i]) ;
            a[len++] = w[i] ;
        }
        sort(a , a + N) ;
        len = unique(a , a + len) - a ;
        scanf("%d" ,&M) ;
        memset(map , 0 , sizeof(map)) ;
        memset(root , 0 , sizeof(root)) ;
        while(M--)
        {
            int u , l , r ;
            scanf("%d%d%d" , &u , &l , &r) ;
            map[u][0] = l ; map[u][1] = r ;
            root[l] = root[r] = 1;
        }
        scanf("%d" , &Q) ;
        for(int i = 1;i <= Q ;i++)
        {
            int v ;
            scanf("%d%d" , &v , &w_x[i]) ;
            vec[v].push_back(i) ;
        }
        int pos ;
        for(int i = 1;i <= N;i++)
        if(!root[i]){pos = i ;break;}
        dfs(pos) ;
        for(int i = 1;i <= Q;i++)
        {
            if(x[i]==-1)puts("0") ;
            else printf("%d %d\n"  , x[i] , y[i]) ;
        }
    }
}

hdu4605Magic Ball Game 树状数组的更多相关文章

  1. HD1556Color the ball(树状数组)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdoj--1556--Color the ball(模拟&&树状数组)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. hdu4605 magic ball game 树状数组+离线处理

    题意:给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左儿子的 ...

  4. HDU 4605 Magic Ball Game 树状数组

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

  5. HDU-4605 Magic Ball Game 树状数组+离散+dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4605 题意:给一颗树,每个节点有个权值w[u],每个节点只有两个儿子或者没有儿子,从根节点放下一个小球 ...

  6. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  7. hdu 1556 Color the ball(树状数组)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意:N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数[a,b]之间的气球 ...

  8. hdu 1556 Color the ball (树状数组)

    Color the ballTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. HDU 1556 Color the ball (树状数组 区间更新+单点查询)

    题目链接 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽&quo ...

随机推荐

  1. Weka中数据挖掘与机器学习系列之Weka3.7和3.9不同版本共存(七)

    不多说,直接上干货! 为什么,我要写此博客,原因是(以下,我是weka3.7.8) 以下是,weka3.7.8的安装版本. Weka中数据挖掘与机器学习系列之Weka系统安装(四) 基于此,我安装最新 ...

  2. 海康录像机 POE 输送距离 实验

    条件:网线 使用亨通  (移动公司使用网线) 测试一:   网线  为130米    白天       摄像头正常录像 电压      3,7号线                 19.6V 测试二: ...

  3. python yield学习

    yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数包 ...

  4. ES6学习笔记(十)代理器Proxy

    Java可以使用面向切面(AOP)的方法来实现某些统一的操作,比如某个操作的前置通知,后置通知等等,这种操作非常方便,其本质便是动态代理,JS的代理Proxy代理该如何使用呢? 某位大神的实现如下: ...

  5. 【Uva 1627】Team them up!

    [Link]: [Description] 给你n个人; 有一些人之间有认识关系 a认识b,b不一定认识a 让你把这n个人分成两组 使得这两组中的每一组: 组内的人与人之间都相互认识. 并且,使得两组 ...

  6. STL heap部分源代码分析

    本文假设你已对堆排序的算法有主要的了解. 要分析stl中heap的源代码的独到之处.最好的办法就是拿普通的代码进行比較.话不多说,先看一段普通的堆排序的代码: //调整大顶堆.使得结构合理 void ...

  7. 转:向IOS设备发送推送通知

    背景 SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的.实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号 ...

  8. Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:在应用域,复合意味着 has-a. 在实现域.复合意味着 is-implemented ...

  9. POJ 1006 Biorhythms (数论-中国剩余定理)

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 111285   Accepted: 34638 Des ...

  10. Android自己定义效果——随机抽奖

    那天逛android开源码的时候,看到一个wheel menu的自己定义效果,就是类似人家的那种转盘抽奖,把人家project看了下.认为非常好玩.可是不想在他上面改,于是就自己想了一个类似的随即抽奖 ...