版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4605

题意:

  有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi 。然后,有一个球,附带值x 。

  球到达某个节点上,如果x==wi,那么球停在这个节点上 。当然,这个点是叶子节点也会停止 。

  如果x<wi,那么有1/2的概率走向左子树,有1/2的概率走向右子树 。

  如果x>wi,那么有1/8的概率走向左子树,有7/8的概率走向右子树 。

  问球经过v节点的概率 。(停在v节点也算)

解法:

  在线的话每一个节点建一棵根节点到该节点的线段树,离线的话就先把询问按DFS序排序,然后瞎搞搞就ok了 。。。

在线主席树

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#define ll long long using namespace std; const int N=; int Ls[N*],Rs[N*],cnt[N*][];
int root[N],tot; int e[N][];
int w[N],sort_w[N]; int n; inline int Hash(int x){
return upper_bound(sort_w+,sort_w+n+,x)-sort_w-;
} inline void init(){
tot=;
memset(e,-,sizeof(e));
} inline int bulidtree(int L,int R){
int k=tot++;
cnt[k][]=cnt[k][]=;
if (L==R) return k;
int mid=(L+R)>>;
Ls[k]=bulidtree(L,mid);
Rs[k]=bulidtree(mid+,R);
return k;
} inline void copy(int x,int y){
Ls[x]=Ls[y];
Rs[x]=Rs[y];
cnt[x][]=cnt[y][];
cnt[x][]=cnt[y][];
} // to 0 左子树 1 右子树
inline int update(int o,int p,int to,int L,int R){
int k=tot++;
copy(k,o);
cnt[k][to]++;
if (L==R) return k;
int mid=(L+R)>>;
if (p<=mid) Ls[k]=update(Ls[k],p,to,L,mid);
else Rs[k]=update(Rs[k],p,to,mid+,R);
return k;
} inline int query(int o,int x,int y,int to,int L,int R){
if (x>y) return ;
if (L==x && R==y) return cnt[o][to];
int mid=(L+R)>>;
if (y<=mid) return query(Ls[o],x,y,to,L,mid);
else if (x>mid) return query(Rs[o],x,y,to,mid+,R);
else return query(Ls[o],x,mid,to,L,mid)+query(Rs[o],mid+,y,to,mid+,R);
} inline void dfs(int u){
for (int i=;i<=;i++) if (~e[u][i]) {
int v=e[u][i];
root[v]=update(root[u],Hash(w[u]),i,,n);
dfs(v);
}
} int main(){
int t,m,q;
scanf("%d",&t);
while (t--){
init(); scanf("%d",&n);
for (int i=;i<=n;i++) {
scanf("%d",&w[i]);
sort_w[i]=w[i];
}
sort(sort_w+,sort_w+n+); scanf("%d",&m);
while (m--){
int u,a,b;
scanf("%d %d %d",&u, &a, &b);
e[u][]=a;
e[u][]=b;
} root[]=bulidtree(,n); dfs(); scanf("%d",&q);
while (q--){
int v,x;
scanf("%d %d",&v,&x);
int id=Hash(x);
if (x==sort_w[id]){
if (query(root[v],id,id,,,n) || query(root[v],id,id,,,n)){
puts("");
continue;
}
} int L_down=query(root[v],,id,,,n);
int L_up=query(root[v],id+,n,,,n);
int R_down=query(root[v],,id,,,n);
int R_up=query(root[v],id+,n,,,n); printf("%d %d\n",R_down,L_up+R_up+*L_down+*R_down);
}
} return ;
}

离线树状数组

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#define ll long long using namespace std; const int N=; int w[N],e[N][];
int sort_w[N];
int c[N][]; // 树状数组
int n,Q;
int pos[N];
int ans[N][]; struct QUERY{
int v,x,id;
int s;
bool operator < (const QUERY & t) const {
return s<t.s;
}
}q[N]; inline int Hash(int x){
return upper_bound(sort_w+,sort_w+n+,x)-sort_w-;
} inline void init(){
memset(c,,sizeof(c));
memset(e,,sizeof(e));
} inline int lowbit(int x){
return x&(-x);
} inline void add(int x,int d,int to){
while (x<=n){
c[x][to]+=d;
x+=lowbit(x);
}
} inline int sum(int x,int to){
int ret=;
while (x){
ret+=c[x][to];
x-=lowbit(x);
}
return ret;
} inline int query(int L,int R,int to){
return sum(R,to)-sum(L-,to);
} int cnt;
inline void dfs1(int u){
pos[u]=++cnt;
for (int i=;i<=;i++) if (e[u][i])
dfs1(e[u][i]);
} inline void dfs2(int u){
while (cnt<=Q && q[cnt].v==u){
int id=Hash(q[cnt].x);
if (sort_w[id]==q[cnt].x){
if (query(id,id,) || query(id,id,)){
ans[q[cnt].id][]=-;
cnt++;
continue;
}
} int L_down=query(,id,);
int L_up=query(id+,n,);
int R_down=query(,id,);
int R_up=query(id+,n,); ans[q[cnt].id][]=R_down;
ans[q[cnt].id][]=L_up+R_up+*L_down+*R_down;
cnt++;
} int id=Hash(w[u]);
for (int i=;i<=;i++) if (e[u][i]) {
add(id,,i);
dfs2(e[u][i]);
add(id,-,i);
}
} int main(){
int t,m;
scanf("%d",&t);
while (t--){
init(); scanf("%d",&n);
for (int i=;i<=n;i++) {
scanf("%d",&w[i]);
sort_w[i]=w[i];
}
sort(sort_w+,sort_w+n+); scanf("%d",&m);
for (int i=;i<=m;i++){
int u,a,b;
scanf("%d %d %d",&u, &a, &b);
e[u][]=a;
e[u][]=b;
} scanf("%d",&Q);
for (int i=;i<=Q;i++){
scanf("%d%d",&q[i].v,&q[i].x);
q[i].id=i;
} cnt=;
dfs1(); for (int i=;i<=Q;i++) q[i].s=pos[q[i].v];
sort(q+,q+Q+); cnt=;
dfs2(); for (int i=;i<=Q;i++){
if (~ans[i][]) printf("%d %d\n",ans[i][],ans[i][]);
else puts("");
}
} return ;
}

hdu 4605 Magic Ball Game (在线主席树/离线树状数组)的更多相关文章

  1. HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一棵二叉树,每个结点孩子数目为0或者2. ...

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

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

  3. HDU 4605 Magic Ball Game (dfs+离线树状数组)

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

  4. HDU 4605 Magic Ball Game 树状数组

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

  5. hdu 4605 Magic Ball Game

    http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball  放在一个数组里(去重),从小到大排列 先不考虑特殊 ...

  6. HDU 4605 Magic Ball Game 主席树

    题意: 给一棵\(n(1 \leq n \leq 10^5)\)个节点的二叉树,除叶子节点外,每个点都有左儿子和右儿子. 每个点上都有一个权值. 游戏规则是这样的:在根节点放一个权值为\(X\)的小球 ...

  7. HDU 4605 Magic Ball Game(离线算法)

    题目链接 思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了. #pragma comment(linker, "/STACK:1 ...

  8. HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)

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

  9. 【HDOJ】4605 Magic Ball Game

    思路1:树状数组+离线处理,对所有的w离散化处理,边dfs边使用树状数组更新左右w的情况.思路2:主席树,边bfs边建树.结点信息存储cnt,然后在线查询.树状数组. /* 4605 */ #incl ...

随机推荐

  1. 管理与技术未必不可兼得,一个20年IT老兵的码农生涯

    作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...

  2. 【HDU4652】Dice(数学期望,动态规划)

    [HDU4652]Dice(数学期望,动态规划) 题面 Vjudge 有一个\(m\)面骰子 询问,连续出现\(n\)个相同的时候停止的期望 连续出现\(n\)个不同的时候停止的期望 题解 考虑两种分 ...

  3. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  4. acid(数据库事务正确执行的四个基本要素的缩写)

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...

  5. 电子商务(电销)平台中用户模块(User)数据库设计明细

    以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 用户基础表(user_base)|-- 自动编号 (user_id)|-- 用户名 (us ...

  6. [学习笔记]Min-25筛

    %%yyb %%zsy 一. 基本操作:筛1~N中的素数个数.n=1e9 设F(M,j)表示,2~M的所有数中,满足以下条件之一的数的个数:①x是质数②x最小质因子大于(注意是大于没有等号)$P_j$ ...

  7. Yura

    Portal --> broken qwq Description ​  给你一个长度为\(n\)的序列\(a\)和一个正整数\(k\),求满足如下条件的区间\([l,r]\)的数量:\((\s ...

  8. 【bzoj3669】魔法森林

    Portal-->bzoj3669 Solution ​  愉悦智力康复ing ​​  这题的话有两个比较关键的地方 ​​  首先是答案肯定是原图的某个生成树上的一条路径,那么我们考虑怎么来找这 ...

  9. Java--Inheritance constructor继承中的构造方法问题(一)

    Java规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,允许多层继承,即子类还可以有自己的子类,在下一层继承关系中原先的子类就变成了父类,这样的继承关系就形成了继承树. 子类 ...

  10. HDU--2722

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2722 分析:简单最短路,读入数据烦. #include<iostream> #includ ...