两颗线段树,分别维护向左走向右走的情况

线段树的结点维护区间有多少点被路径经过了

离线读入所有询问,dfs遍历树的每一个结点,访问到v时解决对v的所有查询,在dfs过程中只需要维护根节点到v的链,线段树查询链上有多少结点值大于或小于询问的x,即能求出到达x的概率

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
/*
类似二叉搜索树
给定一颗n个结点的二叉树
给定数值x,从root开始沿着二叉树往下搜索,分三种情况
1.搜到叶子结点或者结点权值等于X,停止搜索
2.搜到结点权值w<x,搜索左右儿子几率各为1/2
3.w>=x,搜索左右儿子几率各为1/8,7/8
问v点被搜索到的概率是多少 两棵线段树保存向左走向右走的结果分布情况
离线+dfs
*/
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define maxn 110000
#define lmin 1
#define rmax len
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
#define INF 999999999999
#define LL long long
#define mod 10007
struct list
{
int father;
int l,r;
int w;
}node[maxn];//树的结点
vector<int>vec[maxn];//询问结点v的问题编号
struct listt
{
int x,y;
int v;
int w;
}qq[maxn];//询问
map<int,int>mp;
int len;
int fs[maxn*];//离散化后的权值
int st=;
int sum[maxn*][];//两棵线段树
void updata(int ll,int rr,int x,int leap,int_now)
{
if(ll>r||rr<l)return;
if(ll<=l&&rr>=r)
{
sum[rt][leap]+=x;
return;
}
updata(ll,rr,x,leap,lson);
updata(ll,rr,x,leap,rson);
sum[rt][leap]=sum[rt<<][leap]+sum[rt<<|][leap];
}
int query(int ll,int rr,int leap,int_now)
{
if(ll>r||rr<l)return ;
if(ll<=l&&rr>=r)return sum[rt][leap];
return query(ll,rr,leap,lson)+query(ll,rr,leap,rson);
}
void dfs(int x)
{
for(int i=;i<vec[x].size();i++)//遍历结点x对应的每个询问
{
int bi=vec[x][i];
int w=qq[bi].w;
w=mp[w];
int nm=query(w,w,,root)+query(w,w,,root);//nm只有在走不到x结点时才非0
int ll=query(,w-,,root);//root到x路径上结点权值小于w并且球向左走的点个数
int lr=query(w+,len,,root);//root到x路径上结点权值大于w并且球向左走的点个数
int rl=query(,w-,,root);//root到x路径上结点权值小于w并且球向左走的点个数
int rr=query(w+,len,,root);//root到x路径上结点权值小于w并且球向左走的点个数;
if(nm!=)continue;
qq[bi].x=rl;
qq[bi].y=(ll+rl)*+lr+rr; }
int id=mp[node[x].w];
if(node[x].l!=)
{
updata(id,id,,,root);//在向左走的线段树中更新当前结点的权值
dfs(node[x].l);
updata(id,id,-,,root);//回溯,取消本次更新
}
if(node[x].r!=)
{
updata(id,id,,,root);
dfs(node[x].r);
updata(id,id,-,,root);
}
}
int main()
{
int T,n,m,u,l,r;
scanf("%d",&T);
while(T--)
{
st=;
memset(sum,,sizeof(sum));
memset(node,,sizeof(node));
mp.clear();
scanf("%d",&n);
len=;
for(int i=;i<=n;i++)
{
scanf("%d",&node[i].w);
fs[++st]=node[i].w;
vec[i].clear();
}
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&u,&l,&r);
node[l].father=node[r].father=u;
node[u].l=l;
node[u].r=r;
}
node[].father=-;
int q,v,ww;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
scanf("%d%d",&v,&ww);
fs[++st]=ww;
qq[i].v=v;
qq[i].w=ww;
qq[i].x=qq[i].y=-;
vec[v].push_back(i);
}
sort(fs+,fs+st+);
len=;
fs[]=-;
for(int i=;i<=st;i++)
{
if(fs[i]!=fs[i-])
{
if(mp.find(fs[i])==mp.end())
{
mp[fs[i]]=++len;
}
}
}
dfs();
for(int i=;i<=q;i++)
{
if(qq[i].x==-)puts("");
else
{
printf("%d %d\n",qq[i].x,qq[i].y);
}
}
}
return ;
}

hdu4605的更多相关文章

  1. hdu4605 树状数组+离散化+dfs

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

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

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

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

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

  4. 2013 Multi-University Training Contest 1

    HDU-4605 Magic Ball Game 题意:给定一颗以1为根的数,每个节点要么有两个孩子节点,要么没有孩子,每个节点有一个重量,现在从节点1往下放置一个小球,根据小球和节点的重量的不同球落 ...

  5. HDU5140---Hun Gui Wei Company (主席树)

    主席树太强大了,,如果仅仅用来求第k大就太屈才了..貌似和HDU4605差不多,那个是在图上根据点的顺序建立主席树,这个是根据年龄大小 或者等级高低建立主席树. 题意 大致就是一个二维区间的求和,但是 ...

随机推荐

  1. 搭建ftp

    相信很多人都知道ftp吧.打个比方.在你们公司或者学校里面有一个ftp地址,里面存放了你们所需要的一些常用的资源.这样的话你们就可以随时登录这个ftp来拉取你所需要的资源(在范围内),简单的来说,ft ...

  2. Hbase记录-Hbase基础概念

    HBase是什么? HBase是建立在Hadoop文件系统之上的分布式面向列的数据库.它是一个开源项目,是横向扩展的. HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数 ...

  3. div中让内容能不换行就尽量不换行.【纯原】

    div中让内容能不换行就尽量不换行,部分左对齐,部分右对齐. <html> <head> <title>九歌·少司命</title> <style ...

  4. KDevelop使用经验

    KDevelop中不显示行号: 1.上方菜单栏"编辑器"->查看->Show Line Numbers 2.设置->配置编辑器->Appearance-&g ...

  5. mysql alter 用法,修改表,字段等信息

    一: 修改表信息 1.修改表名 alter table test_a rename to sys_app; 2.修改表注释 alter table sys_application comment '系 ...

  6. css颜色模式hsla和rgba

    在CSS3中可以使用RGBA和HSLA两种色彩模式,这两个都可以用来设置颜色以及指定透明度. rgba指的是:红色.绿色.蓝色.Alpha透明度(Red-Green-Blue-Alpha)前三个值取值 ...

  7. python读取Excel文件。

    #!/usr/bin/python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import urllib.request import ...

  8. Bootstrap模态框(一个页面显示多个)的使用

    在一个页面显示多个模态框时要讲每个模态框用div包裹起来,否咋会产生格式错误. <html> <head> <meta charset="utf-8" ...

  9. 【CTF WEB】ISCC 2016 web 2题记录

      偶然看到的比赛,我等渣渣跟风做两题,剩下的题目工作太忙没有时间继续做. 第1题 sql注入: 题目知识 考察sql注入知识,题目地址:http://101.200.145.44/web1//ind ...

  10. 如何将SVN仓库转换为Git仓库

    按如下步骤操作就可以将SVN仓库完整的转换为Git仓库: 1) 将远程SVN仓库搬到本地(这一步主要是为了提高转换的速度,也可以忽略)     参考这篇文章: http://rongjih.blog. ...