hdu4605 树状数组+离散化+dfs
Magic Ball Game
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2189 Accepted Submission(s): 634
a node has 2 children balls, we may define one as the left child and the other as the right child.
The rules are simple: when Kimi decides to drop a magic ball with a weight of X, the ball goes down through the tree from the root. When the magic ball arrives at a node in the tree, there's a possibility to be catched and stop rolling, or continue to roll
down left or right. The game ends when the ball stops, and the final score of the game depends on the node at which it stops.
After a long-time playing, Kimi now find out the key of the game. When the magic ball arrives at node u weighting w[u], it follows the laws below:
1 If X=w[u] or node u has no children balls, the magic ball stops.
2 If X<w[u], there's a possibility of 1/2 for the magic ball to roll down either left or right.
3 If X>w[u], the magic ball will roll down to its left child in a possibility of 1/8, while the possibility of rolling down right is 7/8.
In order to choose the right magic ball and achieve the goal, Kimi wonders what's the possibility for a magic ball with a weight of X to go past node v. No matter how the magic ball rolls down, it counts if node v exists on the path that the magic ball goes
along.
Manual calculating is fun, but programmers have their ways to reach the answer. Now given the tree in the game and all Kimi's queries, you're required to answer the possibility he wonders.
Each test case begins with an integer N(1≤N≤105), indicating the number of nodes in the tree. The following line contains N integers w[i], indicating the weight of each node in the tree. (1 ≤ i ≤ N, 1 ≤ w[i] ≤ 109, N is odd)
The following line contains the number of relationships M. The next M lines, each with three integers u,a and b(1≤u,a,b≤N), denotes that node a and b are respectively the left child and right child of node u. You may assume the tree contains exactly N nodes
and (N-1) edges.
The next line gives the number of queries Q(1≤Q≤105). The following Q lines, each with two integers v and X(1≤v≤N,1≤X≤109), describe all the queries.
answer should be put down in one line.
3
2 3 1
1
1 2 3
3
3 2
1 1
3 4
0 0
1 3
/*
hdu4605 树状数组+离散化+dfs
一个很明显的错误,在网上找了几个测试案例居然都过了TAT,也是无语
最开始发现可以通过判断你走到当前节点左右的次数 和 比你小的个数 比X大 1/2 1/2 比X小 1/8 7/8
相当于比X大时有一个2,当比X小时有3个2 7则看情况。
所以可以遍历树,然后判断。 比当前数小的数的个数则用树状数组维护 但是最开始写出来翻了很2的错误,我只保存了到当前节点小的数个数
(即没有区分左右)以及左右次数,但实际上这样并不能得出有多少次在比它小
的时候往右走即7/8的次数 于是乎把树状数组保存的内容弄成二维的就好了。然后就是最开始的离散化了
hhh-2016-03-03 22:57:09
*/
#include <algorithm>
#include <cmath>
#include <queue>
#include <iostream>
#include <cstring>
#include <map>
#include <cstdio>
#include <vector>
#include <functional>
using namespace std;
typedef long long ll;
const int maxn = 150050;
const int inf = 0x3f3f3f3f;
int s[maxn*2][2];
int n,tot;
int ans[maxn][2];
int vec[maxn*2];
int vis[maxn];
struct node
{
int val;
int l,r;
} pnode[maxn]; vector<pair<int,int> >qu[maxn];
int lowbit(int x)
{
return x&(-x);
} void add(int x,int val,int i)
{
while(x <= tot)
{
s[x][i]+=val;
x += lowbit(x);
}
} int sum(int x,int i)
{
int cnt = 0;
while(x)
{
cnt += s[x][i];
x -= lowbit(x);
}
return cnt;
} void dfs(int u,int l,int r)
{
int lson=pnode[u].l,rson=pnode[u].r,pos;
for(int i = 0; i < (int)qu[u].size(); i++)
{
int id = qu[u][i].first;
int lim = qu[u][i].second;
pos = lower_bound(vec,vec+tot,lim)-vec+1;
int ls = sum(pos-1,0);
int rs = sum(pos-1,1);
int lls = sum(pos,0);
int rrs = sum(pos,1);
if(ls+rs != lls+rrs)
{
ans[id][0] = -1;
continue;
}
ans[id][0] = (ls+rs)*2+l+r;
ans[id][1] = rs;
}
pos = lower_bound(vec,vec+tot,pnode[u].val)-vec+1; if(lson != -1)
{
add(pos,1,0);
dfs(lson,l+1,r);
add(pos,-1,0);
}
if(rson != -1)
{
add(pos,1,1);
dfs(rson,l,r+1);
add(pos,-1,1);
}
return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(s,0,sizeof(s));
memset(ans,0,sizeof(ans));
int m,q,M,v;
tot = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&pnode[i].val);
pnode[i].l = pnode[i].r = -1;
vec[tot++] = (pnode[i].val);
}
scanf("%d",&m);
for(int i =1; i <= m; i++)
{
int x;
scanf("%d",&x);
scanf("%d%d",&pnode[x].l,&pnode[x].r);
}
scanf("%d",&q);
for(int i =1; i <= q+n; i++)qu[i].clear();
for(int i =1; i <= q; i++)
{
scanf("%d%d",&v,&M);
qu[v].push_back(make_pair(i,M));
vec[tot++] = M;
}
sort(vec,vec+tot);
tot = unique(vec,vec+tot)-vec;
dfs(1,0,0);
for(int i =1; i <=q ; i++)
{
if(ans[i][0] == -1)
printf("0\n");
else
printf("%d %d\n",ans[i][1],ans[i][0]);
}
}
return 0;
}
hdu4605 树状数组+离散化+dfs的更多相关文章
- (好题)树状数组+离散化+DFS序+离线/莫队 HDOJ 4358 Boring counting
题目传送门 题意:给你一棵树,树上的每个节点都有树值,给m个查询,问以每个点u为根的子树下有多少种权值恰好出现k次. 分析:首先要对权值离散化,然后要将树形转换为线形,配上图:.然后按照右端点从小到大 ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- BZOJ3881[Coci2015]Divljak——AC自动机+树状数组+LCA+dfs序+树链的并
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- POJ 2299 【树状数组 离散化】
题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...
- BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- HDU-4605 Magic Ball Game 树状数组+离散+dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4605 题意:给一颗树,每个节点有个权值w[u],每个节点只有两个儿子或者没有儿子,从根节点放下一个小球 ...
- HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: weak pair的要求: 1.u是v的祖先(注意不一定是父亲) 2.val[u]*va ...
- hdu 5877 Weak Pair dfs序+树状数组+离散化
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...
随机推荐
- 在arc模式下 CGImage 释放问题
//大图bigImage //定义myImageRect,截图的区域 if (imagecount >= 3) { CGRect myImageRect; if (i.size.width< ...
- 第四十四条:为所有导出的API元素编写文档注释
简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...
- 【技巧】Java工程中的Debug信息分级输出接口及部署模式
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- Angular开发实践(八): 使用ng-content进行组件内容投射
在Angular中,组件属于特殊的指令,它的特殊之处在于它有自己的模板(html)和样式(css).因此使用组件可以使我们的代码具有强解耦.可复用.易扩展等特性.通常的组件定义如下: demo.com ...
- 我自己总结的C#开发命名规范整理了一份
我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报 分类: C#(39) 版权声明:本文为博主原创文章, ...
- React 深入系列2:组件分类
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...
- 解决IE下a标签点击有虚线边框的问题
解决IE下a标签点击有虚线边框的问题 关键词:IE去除虚线边框.IE解决a标签虚线问题 先看看IE下,a标签出现的虚线边框问题: (上面中,红线包裹的就是一个翻页的按钮,按钮实际是hml的a标签做的, ...
- ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...
- linux下的Shell编程(8)自定义函数
Shell Script中也可以使用自定义的函数,其语法形式如下: functionname() { - }
- JSON(一)——JSON与JavaScript的关系
JSON是一种轻量级的数据交换格式,全称--JavaScript 对象表示法(JavaScript Object Notation). 类比XML,你可以把JSON看作是一种存储数据的格式类型,一种数 ...