先离线记录所有询问,然后用dfs在线记录当前节点的所有父亲结点,父亲结点分为两类,一个从左边过来,一个从右边过来,分别开一个数组。

数据需要离散化,刚开始用lower_bound写,一直wa。。,用二分就过了。

之后总结了下lower_bound和upper_bound的规律。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int a[7]={5,9,13,19,25,39,100};
int main()
{
int i,j,k,n;
while(scanf("%d",&n))
{
printf("%d\n",lower_bound(a,a+7,n)-a);//第一个大于等于他的数的下标,当不存在大于等于他的数时,返回数组最后一个数下标加一
printf("%d\n",upper_bound(a,a+7,n)-a);//第一个大于他的数的下标,当不存在大于他的数时,返回数组最后一个数下标加一
}
}

下面是代码

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
#define LL long long
using namespace std;
const int maxn=100005;
int cl[100005],cr[100005],p[100005],quar,len;
int w[maxn],numl=0,numr=0,flag;
vector<int>son[100005];
vector< pair<int,int> >q[100005];
struct Q
{
int x,y;
}qq[100005];
int lowbit(int cur)
{
return cur&(-cur);
}
void update(int cur,int dir,int s)
{
if(dir==-1)
while(cur<maxn)
{
cl[cur]+=s;
cur+=lowbit(cur);
}
else
while(cur<maxn)
{
cr[cur]+=s;
cur+=lowbit(cur);
}
}
int getnum(int cur,int dir)
{
int ans=0;
if(dir==-1)
{
while(cur>0)
{
ans+=cl[cur];
cur-=lowbit(cur);
}
}
else
{
while(cur>0)
{
ans+=cr[cur];
cur-=lowbit(cur);
}
}
return ans;
}
int findcou(int cur)
{
int st=0,ed=len-1,mid;
if(p[ed]<cur)return len-1;
if(p[st]>cur)return -1;
while(st<ed)
{
mid=(st+ed)/2;
if(p[mid]==cur){flag=1;return mid;}
if(p[mid]>cur)ed=mid;
else st=mid+1;
}
if(p[st]==cur)
{
flag=1;
return st;
}
return st-1;
}
void dfs(int s)
{
int i,j,k,l,r,x,y,cou,h;
for(i=0;i<q[s].size();i++)
{
k=q[s][i].first;
// printf("s=%d,k=%d,\n",s,k);
flag=0;
k=findcou(k)+1;
//printf("s=%d,k=%d,\n",s,k);
y=numl+numr;
l=getnum(k,-1);
r=getnum(k,1);
//printf("numl=%d,numr=%d,l=%d,r=%d\n",numl,numr,l,r);
y+=2*(l+r);x=r;
if(flag)
{
if(l>0)
{
l-=getnum(k-1,-1);
if(l>0)x=y=-1;
}
if(r>0)
{
r-=getnum(k-1,1);
if(r>0)x=y=-1;
}
}
cou=q[s][i].second;
//puts("ok??");
qq[cou].x=x;qq[cou].y=y;
}
//puts("ok??");
if(son[s].size()==0)return ;
int tmp=findcou(w[s])+1;
//printf("s=%d,tmp=%d\n",s,tmp);
update(tmp,-1,1);numl++;dfs(son[s][0]);
//printf("numl=%d,numr=%d,",numl,numr);
update(tmp,-1,-1);numl--; update(tmp,1,1);numr++;dfs(son[s][1]);
update(tmp,1,-1);numr--;
}
int main()
{
int j,m,n,v,x;
int t,i,tmp,u,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
p[i-1]=w[i];
cl[i]=cr[i]=0;
son[i].clear();
q[i].clear();
}
sort(p,p+n);
len=unique(p,p+n)-p;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&a,&b);
son[u].push_back(a);
son[u].push_back(b);
// printf("%d----%d\n",u,son[u].size());
}
scanf("%d",&quar);
for(i=0;i<quar;i++)
{
scanf("%d%d",&v,&x);
q[v].push_back(make_pair(x,i));
//printf("%d-----%d\n",i,q[v].size());
}
//for(i=0;i<=len;i++)
//printf("%d,",p[i]);
numr=numl=0;
dfs(1);
for(i=0;i<quar;i++)
if(qq[i].x==qq[i].y&&qq[i].x==-1)
puts("0");
else
printf("%d %d\n",qq[i].x,qq[i].y);
}
return 0;
}

4605 Magic Ball Game的更多相关文章

  1. hdu 4605 Magic Ball Game

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

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

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

  3. 【HDOJ】4605 Magic Ball Game

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

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

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

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

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

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

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

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

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

  8. HDU 4605 Magic Ball Game 树状数组

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

  9. HDU 4605 Magic Ball Game 主席树

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

随机推荐

  1. iOS 学习

    iOS 学习资料 (适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解 ...

  2. C#中如何获取系统环境变量

    原文:C#中如何获取系统环境变量 C#中获取系统环境变量需要用到Environment Class.其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承. 以下代码得到%systemd ...

  3. WCF常见问题(1) -- WebService/WCF Session Cookie

    原文:WCF常见问题(1) -- WebService/WCF Session Cookie 在.net 3.0推出WCF之前使用的WebService,有的应用有使用Session保持一些信息,在不 ...

  4. Django教程汇总

    Django基础教程 被解放的姜戈01 初试天涯 被解放的姜戈02 庄园疑云 被解放的姜戈03 所谓伊人 被解放的姜戈04 各取所需 被解放的姜戈05 黑面管家 被解放的姜戈06 假作真时 Djang ...

  5. 《java系统性能优化》--2.高速缓存

    上一节.简介了怎样发现性能瓶颈.从这节開始.我会和大家分享我在项目中做的一些性能调优工作.这个系列没有什么顺序可言,认为什么重要.就说说什么. 这节.我们聊缓存. 最開始接触缓存这个词,是学习硬件知识 ...

  6. Linux下tomcat管理查看控制台|杀死tomcat进程

    查看控制台 # tail -f catalina.out 脚本执行权限chmod u+x *.sh #看是否已经有tomcat在运行了 ps -ef |grep tomcat #如果有,用kill; ...

  7. OpenGL+VS2013+WIN7(64)组态

    1.下载windows在下面glut安装文件:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 2. 拆开发现五个文件 ...

  8. UC编程:字符读取与行读取

    字符读取函数的应用 下面的演示程序实现从/etc/passwd文件中提取用户名,打印到屏幕上并保存在copyname.txt文件中 使用的函数是getc().putc().putchar() [c] ...

  9. ZA7783:MIPI转LVDS/MIPI转RGB888/RGB转LVDS

    在消费类电子越来越白热化阶段.好多设计project师已经開始慢慢关注到成本控制,小金在这里就给大家带来一颗转接IC.希望能帮助贵公司控制成本.当然性能也是可靠的,已经好多产品设计了. 多多不吝赐教 ...

  10. Asp.Net异步编程

    Asp.Net异步编程-使用了异步,性能就提升了吗? Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出 ...