hdu 4605 Magic Ball Game (在线主席树/离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载。
题意:
有一颗树,根节点为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 (在线主席树/离线树状数组)的更多相关文章
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一棵二叉树,每个结点孩子数目为0或者2. ...
- 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 (dfs+离线树状数组)
题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...
- HDU 4605 Magic Ball Game 树状数组
题目大意很简单. 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点.然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走. 每碰到一个结点,有三种情况 如果 ...
- hdu 4605 Magic Ball Game
http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball 放在一个数组里(去重),从小到大排列 先不考虑特殊 ...
- HDU 4605 Magic Ball Game 主席树
题意: 给一棵\(n(1 \leq n \leq 10^5)\)个节点的二叉树,除叶子节点外,每个点都有左儿子和右儿子. 每个点上都有一个权值. 游戏规则是这样的:在根节点放一个权值为\(X\)的小球 ...
- HDU 4605 Magic Ball Game(离线算法)
题目链接 思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了. #pragma comment(linker, "/STACK:1 ...
- HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【HDOJ】4605 Magic Ball Game
思路1:树状数组+离线处理,对所有的w离散化处理,边dfs边使用树状数组更新左右w的情况.思路2:主席树,边bfs边建树.结点信息存储cnt,然后在线查询.树状数组. /* 4605 */ #incl ...
随机推荐
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- C++函数中的那些坑
平时写程序时,我们可能或多或少对一些用法感到朦胧,下面我对一些易困惑大家,或者易用错的地方作点介绍. 一.函数的一些注意点 1.函数返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针. 2 ...
- 题解 P1423 【小玉在游泳】
这道题可以用简单的蒟蒻do-while循环,方式:直到型 因为是萌新/蒟蒻,所以并不知道这道题的时间/空间复杂度是多大 脚踩std(^▽^)摩擦 #include <iostream> # ...
- 深入理解JVM一性能监控工具
一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...
- BSGS和扩展BSGS
BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...
- 洛谷 P2664 树上游戏 解题报告
P2664 树上游戏 题目描述 \(\text{lrb}\)有一棵树,树的每个节点有个颜色.给一个长度为\(n\)的颜色序列,定义\(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以及 ...
- 据说要写一个CTSC&APIO的收获
就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...
- 全面支持Angular2的Web后台Bootstrap模板Sing App - Web & Angular 2.0 Dashboard
在线预览 Sing App v3.3.0 (包含Angular 2.0版本实现) 现在,本模板完全支持Angular2.0版本啦. Sing Web App 是由专业前端工程师采用行业内流行的技术构建 ...
- BMP格式图像读取与存储
全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...
- 手脱FSG v1.33
1.载入PEID FSG v1.33 (Eng) -> dulek/xt 2.载入OD,先F8跟一会 004103E3 > BE A4014000 mov esi,fsg1_33.0040 ...