hdu 4605-Magic Ball Game(树状数组)
题目大意:
给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止;如果w>x,那么它往左、右儿子的概率都是1、2;如果w<x,那么它往左儿子的概率是1/8,右儿子是7/8。现在给你q个询问,问你值为x的球道达节点u的概率为多少。
思路:
用树状数组离线处理。
摘录学长说的:
“从一根节点u到一个点v存在的是唯一的一条确定的道路。我们只需要它在这条路上往左拐的情况中w的值(X可能大于该点的权值grtL,可能小于该点的权值lessL) 往右拐的情况中w的值(X可能大于该点的权值grtR,可能小于该点的权值lessR) 那么对于这个点的询问我们就可以知道:
x = grtR(只有它对7有贡献) y = (lessL + lessR) + (grtL + grtR)*3; ”
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 100005
struct list
{
int l,r;
int w;
}node[maxn];
int fs[maxn*2];
int fss[maxn*2];
struct qq
{
int x;
int id;
}xx;
vector<qq>num[maxn];
int ans[maxn][2];
int sum[maxn][2];
int w[maxn];
int n,m,q,len;
int lowbit(int x)
{
return (x&(-x));
}
int search(int l,int r,int w)
{
while(l<r)
{
int mid=(l+r)/2;
if(fs[mid]==w)return mid;
if(fs[mid]<w)l=mid+1;
else r=mid;
}
}
void add(int x,int bs,int num)
{
for(;x<len;x+=lowbit(x))
{
sum[x][bs]+=num;
}
}
int allsum(int s,int bs)
{
int ss;
ss=0;
while(s>0)
{
ss+=sum[s][bs];
s=s-lowbit(s);
}
return ss;
}
void dfs(int x)
{
int s;
s=num[x].size();
for(int i=0;i<s;i++)
{
xx=num[x][i];
int z,id;
z=search(1,len,xx.x);
id=xx.id;
if(allsum(z,0)-allsum(z-1,0)+allsum(z,1)-allsum(z-1,1)>0)
{
ans[id][0]=-1;
continue;
}
int ll,lr,rl,rr;
ll=allsum(len-1,0)-allsum(z,0);
rl=allsum(z,0);
lr=allsum(len-1,1)-allsum(z,1);
rr=allsum(z,1);
ans[id][0]=rr;
ans[id][1]=(rl+rr)*3+ll+lr;
}
s=search(1,len,node[x].w);
if(node[x].l!=-1)
{
add(s,0,1);
dfs(node[x].l);
add(s,0,-1);
}
if(node[x].r!=-1)
{
add(s,1,1);
dfs(node[x].r);
add(s,1,-1);
}
}
int main()
{
int T,a,b,c,i;
cin>>T;
while(T--)
{
cin>>n;
int ll=1;
memset(fs,0,sizeof(fs));
memset(ans,0,sizeof(ans));
memset(fss,0,sizeof(fss));
for (i = 1; i <= n; ++i) node[i].l = node[i].r = node[i].w = -1;
for(i=1;i<=n;i++)
{
num[i].clear();
scanf("%d",&w[i]);
node[i].w=w[i];
fss[ll++]=w[i];
}
cin>>m;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
node[a].l=b;
node[a].r=c;
}
cin>>q;
for(i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
fss[ll++]=b;
xx.id=i;
xx.x=b;
num[a].push_back(xx);
}
len=1;
sort(fss,fss+ll);
for(i=1;i<ll;i++)
if(fss[i]!=fss[i-1])fs[len++]=fss[i];
dfs(1);
for(i=1;i<=q;i++)
{
if(ans[i][0]==-1)printf("0\n");
else printf("%d %d\n",ans[i][0],ans[i][1]);
}
}
return 0;
}
hdu 4605-Magic Ball Game(树状数组)的更多相关文章
- HDU 4605 Magic Ball Game 树状数组
题目大意很简单. 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点.然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走. 每碰到一个结点,有三种情况 如果 ...
- hdu4605 magic ball game 树状数组+离线处理
题意:给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左儿子的 ...
- HDU-4605 Magic Ball Game 树状数组+离散+dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4605 题意:给一颗树,每个节点有个权值w[u],每个节点只有两个儿子或者没有儿子,从根节点放下一个小球 ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 4605 Magic Ball Game (在线主席树/离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...
- HDU 4605 Magic Ball Game (dfs+离线树状数组)
题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...
- hdu 1556 Color the ball(树状数组)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意:N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数[a,b]之间的气球 ...
- hdoj--1556--Color the ball(模拟&&树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- 《CSS网站布局实录》学习笔记(四)
第四章 CSS网站元素设计 4.1 网站导航 网站导航是网站中最重要的元素.从形式上看,网站导航主要分横向导航.纵向导航.下拉及多级菜单导航灯3种常见形式. 横向导航:作为门户网站的设计而言,主导航一 ...
- MySQL MyISAM/InnoDB高并发优化经验
最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 ...
- Linux下快速搭建DNS服务器
一.术语解释:TTL Time To Live 缓冲保留时间ORIGIN 属于哪个域@ 代指域IN 开头需要空格SOA 一行记录类型的开始参数:forwarders {} 指向自己无法解析的域名跳转到 ...
- MySQL 表子查询
MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...
- JDBC数据源连接池的配置和使用实例
个人学习参考所用,勿喷! 使用JDBC建立数据库连接的两种方式: 1.在代码中使用DriverManager获得数据库连接.这种方式效率低,并且其性能.可靠性和稳定性随着用户访问量得增加逐渐下降. 2 ...
- GUI按键绑定到键盘和打印组件
首先说明一点 按键绑定到键盘和设置快捷键是不一样的 按键绑定键盘是按键有了和button一样的功能,没有焦点时也能使用(WHEN_IN_FOCUSED_WINDOW),甚至有时候单独作为一个事件(有自 ...
- php的冒泡算法
<?php /* 冒泡算法 * @para $arr 传人进去排序的数组 * @return $newArr 排序之后的数组 */ function maopao($arr){ ...
- Microsoft Anti-Cross Site Scripting Library V4.2 下载地址
概述 微软反跨站脚本库V4.2(AntiXSS V4.2)是一种编码库,旨在帮助开发人员保护他们的ASP.NET基于Web的应用程序免受XSS攻击.它不同于编码库,因为它使用的白名单技术-有时也被称为 ...
- 关于ASP.NET MVC中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 ...
- Python自动化运维之9、模块之sys、os、hashlib、random、time&datetime、logging、subprocess
python模块 用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...