题目链接

思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,200+,好久没写过这么长的代码了。

 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <ctime>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 100101
struct node
{
int l,r;
} tree[maxn];
struct nodez
{
int u,v,next;
} edge[];
int w[maxn];
int n;
int pl[maxn];
int pr[maxn];
int que[maxn];
int qu[maxn],qv[maxn];
int o[maxn];
int ww[maxn],num;
int ans1[maxn],ans2[maxn];
int tot;
int first[];
void CL()
{
tot = ;
memset(o,,sizeof(o));
memset(first,-,sizeof(first));
memset(pl,,sizeof(pl));
memset(pr,,sizeof(pr));
}
int lowbit(int t)
{
return t&(-t);
}
void insert1(int t,int d)
{
while(t <= n)
{
pl[t] += d;
t += lowbit(t);
}
}
void insert2(int t,int d)
{
while(t <= n)
{
pr[t] += d;
t += lowbit(t);
}
}
int getsum1(int t)
{
int sum = ;
while(t)
{
sum += pl[t];
t -= lowbit(t);
}
return sum;
}
int getsum2(int t)
{
int sum = ;
while(t)
{
sum += pr[t];
t -= lowbit(t);
}
return sum;
}
int bin(int x)
{
int str,end,mid;
str = ;
end = num;
while(str < end)
{
mid = (str+end)/;
if(w[mid] < x)
str = mid + ;
else
end = mid;
}
return str;
}
void add(int u,int v)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = first[u];
first[u] = tot ++;
}
void dfs(int x)
{
int sp,s1,s2,s3,s4,s5,s6,i,v;
if(o[x])
{
for(i = first[x]; i != -; i = edge[i].next)
{
v = edge[i].v;
if(x == )
{
ans1[v] = ;
ans2[v] = ;
}
else
{
if(qv[v] > w[num])
{
s1 = s2 = getsum1(n);
s5 = ;
s3 = s4 = getsum2(n);
s6 = ;
sp = n;
}
else if(qv[v] < w[])
{
s1 = s2 = s3 = s4 = ;
s5 = getsum1(n);
s6 = getsum2(n);
sp = n;
}
else
{
sp = bin(qv[v]);
s1 = getsum1(sp-);
s2 = getsum1(sp);
s3 = getsum2(sp-);
s4 = getsum2(sp);
s5 = getsum1(n) - s1;
s6 = getsum2(n) - s3;
}
if(w[sp] == qv[v]&&s2 - s1 > )
{
ans1[v] = -;
ans2[v] = ;
}
else if(w[sp] == qv[v]&&s4 - s3 > )
{
ans1[v] = -;
ans2[v] = ;
}
else
{
ans1[v] = s3;
ans2[v] = s3* + s6 + s1* + s5;
}
}
}
}
if(tree[x].l != -)
{
int nu;
nu = bin(ww[x]);
insert1(nu,);
dfs(tree[x].l);
insert1(nu,-);
insert2(nu,);
dfs(tree[x].r);
insert2(nu,-);
}
return ;
}
int main()
{
int i,m,t,fa,ls,rs;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
CL();
for(i = ; i <= n; i ++)
{
scanf("%d",&w[i]);
ww[i] = w[i];
}
for(i = ; i <= n; i ++)
{
tree[i].l = tree[i].r = -;
}
sort(w+,w+n+);
num = ;
for(i = ; i <= n; i ++)
{
if(w[num] != w[i])
w[++num] = w[i];
}
scanf("%d",&m);
for(i = ; i < m; i ++)
{
scanf("%d%d%d",&fa,&ls,&rs);
tree[fa].l = ls;
tree[fa].r = rs;
}
scanf("%d",&m);
for(i = ; i <= m; i ++)
{
scanf("%d%d",&qu[i],&qv[i]);
add(qu[i],i);
o[qu[i]] = ;
}
dfs();
for(i = ; i <= m; i ++)
{
if(ans1[i] == -)
printf("0\n");
else
printf("%d %d\n",ans1[i],ans2[i]);
}
}
return ;
}

HDU 4605 Magic Ball Game(离线算法)的更多相关文章

  1. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

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

  2. hdu 4605 Magic Ball Game

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

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

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

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

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

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

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

  6. HDU 4605 Magic Ball Game 树状数组

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

  7. HDU 4605 Magic Ball Game 主席树

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

  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. shell 生成指定范围随机数与随机字符串 .

    shell 生成指定范围随机数与随机字符串         分类:             shell              2014-04-22 22:17     20902人阅读     评 ...

  2. python将json格式的数据转换成文本格式的数据或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...

  3. Android studio 程序升级和sdk manager 升级方法

    在中国使用android有点郁闷,经常被屏蔽.常遇到2个升级问题,现在总结如下:  1.android studio升级时提示 Connection failed. Please check your ...

  4. oracle10G/11G官方下载地址集合 直接迅雷下载

    Oracle Database 11g Release 2 (11.2.0.1.0) for Microsoft Windows (64-bit)   http://download.oracle.c ...

  5. Linux 底下使用C 对文件进行遍历

    #include <stdio.h>#include <stdlib.h>main (int argc,char *argv[]){char ch;FILE *fp;int i ...

  6. struts2 <s:property/>标签的使用--输出时间格式转换

    转载地址http://hi.baidu.com/nonyi_com/blog/item/acf1b8d74b6cf63e07088bc4.html 最近在使用struts2的<s:propert ...

  7. .net自定义事件,经典简单实例代码

    1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...

  8. ytu 1985:C语言实验——保留字母(水题)

    C语言实验——保留字母 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 136  Solved: 59[Submit][Status][Web Board] ...

  9. Java Hour 34 Weather ( 7 ) struts2 – validate

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 34 Form Validation 一般Form 提交都有验证的, ...

  10. Android快捷键

    Android快捷键ALT+/ :在布局文件中,提示输入的内容Shift + Ctrl +  / :注释Shift + Ctrl +  \ :解除注释