题目链接

思路就很难想+代码实现也很麻烦,知道算法后,已经写的很繁琐而且花了很长时间,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. HDOj 1010 DFS优化

    #include<cstdio> #include<cstring> ]={,,,-}; ]={,,-,}; ][]; int x1,y1,x2,y2; int step; i ...

  2. Android-自定义meta-data扩展数据

    在接入第三方渠道SDK的时候,经常会看到其配置文件AndroidManifest.xml有类似如下的定义: [html] view plaincopy <!-- appid --> < ...

  3. #!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  4. 右移>> 和 左移<<

    一个int占四个字节,也就是32位,这样的话1不论左移还是右移32位仍旧移到原来的位置,就仍旧是1了. 右移是除,左移是乘.1除1除32次和1乘1乘32次当然都还是1了. 移位操作的简单计算方法 &g ...

  5. Redis windows安装配置与Jedis访问数据库

    一 Redis概要 Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它通常被称为数据结构服务器 ...

  6. 【贪心】最大乘积-贪心-高精度-java

    问题 G: [贪心]最大乘积 时间限制: 1 Sec  内存限制: 128 MB提交: 34  解决: 10[提交][状态][讨论版] 题目描述  一个正整数一般可以分为几个互不相同的自然数的和,如3 ...

  7. windows电脑变成wifi热点命令

    netsh wlan set hostednetwork mode=allow ssid=WIFI_NAME key="abcdefgh" netsh wlan start hos ...

  8. vmware安装linux.iso

    安装方法 : .进入Fedora后,在虚拟机选项栏中选VM->install vmware tools 拷贝VMware Tools.tar.gz到指定文件夹,解压缩 进入超级终端:在-> ...

  9. 设置IIS会话过期时间

    打开默认网站----双击ASP--展开会话属性---更改超时时间-

  10. Android之自定义控件入门

    本文主要讲述了实现安卓button点击变色与利用ViewPager实现图片自动轮播效果 我伞可以看到在很多应用中,安卓按钮按下时与正常时状态是不同的,这种效果也很容易达到. 第一步:创建XML文件定义 ...