hdu4605Magic Ball Game 树状数组
//给一棵树。树的每个节点的子节点个数是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 树状数组的更多相关文章
- HD1556Color the ball(树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdoj--1556--Color the ball(模拟&&树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu4605 magic ball game 树状数组+离线处理
题意:给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左儿子的 ...
- HDU 4605 Magic Ball Game 树状数组
题目大意很简单. 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点.然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走. 每碰到一个结点,有三种情况 如果 ...
- HDU-4605 Magic Ball Game 树状数组+离散+dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4605 题意:给一颗树,每个节点有个权值w[u],每个节点只有两个儿子或者没有儿子,从根节点放下一个小球 ...
- Color the ball(HDU1556)树状数组
每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...
- hdu 1556 Color the ball(树状数组)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意:N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数[a,b]之间的气球 ...
- hdu 1556 Color the ball (树状数组)
Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 1556 Color the ball (树状数组 区间更新+单点查询)
题目链接 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽&quo ...
随机推荐
- Bundle捆绑压缩技术
Bundle捆绑压缩技术由命名空间System.Web.Optimization中的类提供.顾名思义,这些类是用来优化Web页面性能的,它们通过压缩文件大小,捆绑文件(把多个文件合成一个下载文件)来实 ...
- vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)
问题: 1.克隆完windows虚拟化后输入法乱码. 2.开启远程的情况下远程登录输入正确的密码也无法登录. 解决: 1.更改管理员用户密码(不输入原win7密码更改win7密码). 2.重新启用管理 ...
- xcode 条件调试
添加条件 有时候我们可能会在某个循环中创建断点,但一次又一次地点击 continue 直到我们想要的条件出现,显然是一种非常低效的方式.好在 Xcode 为我们提供了条件断点. 首先在下列代码中插入一 ...
- nodejs操作文件和数据流
前言 node中有一组流api,它们可以像处理网络流一样处理文件.流api用起来非常方便,本节学习介绍文件处理基础和流的概念. 目录 处理文件路径 fs核心模块简介 操作流 慢客户端问题 1. 处理文 ...
- BZOJ2337: [HNOI2011]XOR和路径(高斯消元,期望)
解题思路: Xor的期望???怕你不是在逗我. 按为期望,新技能get 剩下的就是游走了. 代码: #include<cmath> #include<cstdio> #incl ...
- highcharts中的x轴如何显示时分秒时间格式
上一篇文章写道:三分钟上手Highcharts简易甘特图:https://www.jianshu.com/p/d669d451711b,在官方文档里面,x轴默认为年月日. 在项目需求中,x轴要表示24 ...
- 利用js 获取ip和地址
1.引用第三方js<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> 2. I ...
- Linux中配置网桥
使用kvm虚拟机时,有时候需要自己添加网桥供guest使用. 不使用libvirt来管理的话,可以使用以下方法创建网桥并绑定到物理网卡(RHEL6/Fedora已实验): 1.创建网桥配置文件ifcf ...
- 怎样借助log4j把日志写入数据库中
log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...
- Linux下使用fstatfs/statfs查询系统相关信息
Linux下使用fstatfs/statfs查询系统相关信息 1. 功能 #include < sys/statfs.h > int statfs(const char *path, ...