hdu 4605-Magic Ball Game(树状数组)

时间:2022-09-04 17:27:23

题目大意:

给你一棵二叉树,每个节点有一个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(树状数组)的更多相关文章

  1. HDU 4605 Magic Ball Game 树状数组

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

  2. hdu4605 magic ball game 树状数组&plus;离线处理

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

  3. HDU-4605 Magic Ball Game 树状数组&plus;离散&plus;dfs

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

  4. HDU 5862 Counting Intersections&lpar;离散化&plus;树状数组&rpar;

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  5. hdu 5517 Triple&lpar;二维树状数组&rpar;

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

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

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

  7. hdu 4605 Magic Ball Game &lpar;在线主席树&sol;离线树状数组&rpar;

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

  8. HDU 4605 Magic Ball Game (dfs&plus;离线树状数组)

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

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

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

  10. hdoj--1556--Color the ball&lpar;模拟&amp&semi;&amp&semi;树状数组&rpar;

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

随机推荐

  1. Css3新特性应用之视觉效果

    一.单侧阴影 box-shadow属性的应用,格式:h-shadow v-shadow blur spread color inset属性取值介绍 h-sahdow:水平阴影的位置,允许负值 v-sh ...

  2. Lazy Load&comma; 延迟加载图片的 jQuery 插件&period;

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  3. HDU1502 Regular Words

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:当只有两个数时,可以用卡特兰数做,当三个数时,没想到卡特兰数的做法.可以使用动态规划. 状态转 ...

  4. Why restTemplate&period;put&lpar;&rpar; throws &OpenCurlyDoubleQuote;HttpClientErrorException&colon; 404 Not Found”

      I make a put request RestTemplate restTemplate = new RestTemplate(); restTemplate.put(new URI(&quo ...

  5. sql 语句查询练习题

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from student 2. 查询教师所有的单位即不重复的Depart列 ...

  6. Xcode使用版本

    Xcode6中创建分类.协议等文件的方法 Xcode 5.1.1 与 Xcode 6.0.1 的共存之路 http://jingyan.baidu.com/article/1612d500457df1 ...

  7. JAVA字符串格式化-String&period;format&lpar;&rpar;的使用 &lpar;转载&rpar;

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  8. 团体程序设计天梯赛-练习集L1-012&period; 计算指数

    L1-012. 计算指数 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 真的没骗你,这道才是简单题 —— 对任意给定的不超过1 ...

  9. ZOJ2099

    题意:给多个点,连成折线,求一个矩形可以包含这条折线. 输入: 多组测试数据 多个点的坐标 每组测试数据以0,0结束 以0,0结束程序 输出: 矩形左下角和右上角的坐标 思路:水题,注意输入那里有点坑 ...

  10. 二叉树终极教程--BinarySearchTree

    BinarySearchTreeMap 的 实现 public interface Map<K extends Comparable<K>, V> { void put(K k ...