多校联合 F Magic Ball Game (hdu 4605) (二)

2014-11-23 22:13:34 ? 作者: ? 浏览: 12
1,1)>0)//如果已经存在x { ans[num][0]=-1; } else { int lma,lmi,rma,rmi;// 左边大于,左边小于,右边大于,右边小于 lmi=getsum(x-1,0); lma=getsum(len,0)-getsum(x,0); rmi=getsum(x-1,1); rma=getsum(len,1)-getsum(x,1); ans[num][0]=rmi; ans[num][1]=3*(rmi+lmi)+rma+lma; } } if(node[now].left!=-1) { addnum(w,1,0); dfs(node[now].left); addnum(w,-1,0); } if(node[now].right!=-1) { addnum(w,1,1); dfs(node[now].right); addnum(w,-1,1); } } int main() { //freopen("dd.txt","r",stdin); int ncase; scanf("%d",&ncase); while(ncase--) { int n,i,m,q,x,v; scanf("%d",&n); init(n); for(i=1;i<=n;i++) { scanf("%d",&node[i].w); po[i]=node[i].w; } scanf("%d",&m); int a,b,cc; memset(vis,0,sizeof(vis)); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&cc); add(a,b,cc); vis[b]=vis[cc]=1; } scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%d%d",&v,&x); vec[v].push_back(x); vec[v].push_back(i); po[i+n]=x; } sort(po+1,po+q+n+1); len=unique(po+1,po+q+n+1)-(po+1); int root; for(i=1;i<=n;i++) { if(!vis[i]) { root=i; break; } } for(i=0;i<=len;i++) c[i][0]=c[i][1]=0; dfs(root); for(i=1;i<=q;i++) { if(ans[i][0]==-1) printf("0\n"); else printf("%d %d\n",ans[i][0],ans[i][1]); } } return 0; } #include #include #include #include #include #define maxn 100010 #define mid ((t[p].l+t[p].r)>>1) #define ls (p<<1) #define rs (ls|1) using namespace std; struct Tree { int w; int left,right; }node[maxn]; vector vec[maxn]; int c[maxn<<1][2]; void init(int n) { for(int i=0;i<=n;i++) { vec[i].clear(); node[i].left=node[i].right=node[i].w=-1; } } void add(int a,int b,int c) { node[a].left=b; node[a].right=c; } int ans[maxn][2],vis[maxn],po[maxn<<1],len; int lowbit(int x) { return x&(-x); } void addnum(int x,int val,int tt) { while(x<=len) { c[x][tt]+=val; x+=lowbit(x); } } int getsum(int x,int tt) { int sum=0; while(x>0) { sum+=c[x][tt]; x-=lowbit(x); } return sum; } int search(int len,int x) { int mi=1,ma=len,Mid; while(mi<=ma) { Mid=(mi+ma)>>1; if(po[Mid]==x) return Mid; if(po[Mid]0||getsum(x,1)-getsum(x-1,1)>0)//如果已经存在x { ans[num][0]=-1; } else { int lma,lmi,rma,rmi;// 左边大于,左边小于,右边大于,右边小于 lmi=getsum(x-1,0); lma=getsum(len,0)-getsum(x,0); rmi=getsum(x-1,1); rma=getsum(len,1)-getsum(x,1); ans[num][0]=rmi; ans[num][1]=3*(rmi+lmi)+rma+lma; } } if(node[now].left!=-1) { addnum(w,1,0); dfs(node[now].left); addnum(w,-1,0); } if(node[now].right!=-1) { addnum(w,1,1); dfs(node[now].right); addnum(w,-1,1); } } int main() { //freopen("dd.txt","r",stdin); int ncase; scanf("%d",&ncase); while(ncase--) { int n,i,m,q,x,v; scanf("%d",&n); init(n); for(i=1;i<=n;i++) { scanf("%d",&node[i].w); po[i]=node[i].w; } scanf("%d",&m); int a,b,cc; memset(vis,0,sizeof(vis)); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&cc); add(a,b,cc); vis[b]=vis[cc]=1; } scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%d%d",&v,&x); vec[v].push_back(x); vec[v].push_back(i); po[i+n]=x; } sort(po+1,po+q+n+1); len=unique(po+1,po+q+n+1)-(po+1); int root; for(i=1;i<=n;i++) { if(!vis[i]) { root=i; break; } } for(i=0;i<=len;i++) c[i][0]=c[i][1]=0; dfs(root); for(i=1;i<=q;i++) { if(ans[i][0]==-1) printf("0\n"); else printf("%d %d\n",ans[i][0],ans[i][1]); } } return 0; }

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: