4605 Magic Ball Game
来源:互联网 发布:微信怎么在淘宝付款 编辑:程序博客网 时间:2024/05/23 01:38
先离线记录所有询问,然后用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 longusing 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
- hdu 4605 Magic Ball Game
- hdu 4605 Magic Ball Game
- hdu 4605 Magic Ball Game
- hdu 4605 Magic Ball Game
- HDU 4605 Magic Ball Game
- HDU.4605 Magic Ball Game
- HDU 4605 Magic Ball Game 解题报告
- HDU 4605 Magic Ball Game 树状数组
- HDU 4605 Magic Ball Game 树状数组
- Magic Ball Game - HDU 4605 树状数组
- HDU 4605 Magic Ball Game 树状数组
- hdu4605 Magic Ball Game
- HDU4605-Magic Ball Game
- hdu 4605 Magic Ball Game 多校第一场
- 2013 多校第一场 hdu 4605 Magic Ball Game
- hdu 4605-Magic Ball Game(树状数组)
- hdu-4605-Magic Ball Game-线段树+离线操作
- ssh项目使用dwr框架
- JS数组定义
- 高并发操作和查询的数据采集和查询系统的oracle数据库设计建议
- UITableView简单解析
- [Android开发常见问题-12] Android开发中debug.keystore如何使用。
- 4605 Magic Ball Game
- Android系统移植与调试之------->Amlogic方案编译步骤
- 黑马程序员——c#中new的用法小结 十一
- iOS开发中的单元测试(一)&(二)
- JS中数组Array的用法
- TURBOMOLE 6.5 for Windows x86_64 demo版的破解
- hibernate对象三种状态
- 如何看待一场争论
- debug lanucher