首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define N 100010 #define l(i) i<<1 #define r(i) i<<1|1 struct node{ int l,r,mx; }T[N*4]; int mx; struct Data{ int x,id; }; int v[N],ans[N];//值,答案 vector<Data>a[N]; vector<int>son[N]; void build(int l,int r,int k){ T[k].l=l; T[k].r=r; T[k].mx=0; if(l==r)return; int mid=(l+r)/2; build(l,mid,l(k)); build(mid+1,r,r(k)); } int insert(int d,int k,int v){//值k插入区间[d,d] if(T[k].l==T[k].r)return T[k].mx=v; int ll=l(k); int rr=r(k); if(T[ll].r>=d)insert(d,ll,v);//往左 else if(T[rr].l<=d) insert(d,rr,v);//往右 return T[k].mx=max(T[ll].mx,T[rr].mx); } void query(int l,int r,int k){//查询区间[l,r] if(T[k].l==l&&T[k].r==r){ mx=max(mx,T[k].mx); return; } int ll=l(k); int rr=r(k); if(T[ll].r>=r)query(l,r,ll);//往左 else if(T[rr].l<=l)query(l,r,rr);//往右 else{ query(l,T[ll].r,ll);//往左 query(T[rr].l,r,rr);//往右 } } void dfs(int x,int d){ int i,j,k; insert(d,1,v[x]);//插入v //cout<<"插入"<<x<<" "<<v[x]<<endl; for(i=0;i<a[x].size();i++){//查询x结点 k=d-a[x][i].x; mx=-1; if(k>=0)query(k,d,1); ans[a[x][i].id]=mx; //cout<<x<<" "<<k<<" "<<d<<" "<<mx<<endl; } for(i=0;i<son[x].size();i++)//遍历儿子 dfs(son[x][i],d+1);//递归遍历 } int main(){ int n,i,j,k; v[0]=0; struct Data s; while(scanf("%d",&n)!=EOF){ memset(a,0,sizeof(a)); memset(son,0,sizeof(son)); build(0,n-1,1);//建立空树 for(i=1;i<=n;i++)scanf("%d",&v[i]); for(i=1;i<=n;i++){ scanf("%d",&j); son[j].push_back(i);//i是j的儿子 } scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d%d",&j,&k); s.x=j;s.id=i; a[k].push_back(s); } /*for(i=0;i<=n;i++){ cout<<i<<":"; for(j=0;j<son[i].size();j++){ cout<<son[i][j]<<" "; } cout<<endl; }*/ dfs(0,0);//从根遍历到最后 for(i=0;i<n;i++) if(ans[i]==-1)printf("Wrong request\n"); else printf("%d\n",ans[i]); } return 0; }
文章结束给大家分享下程序员的一些笑话语录: 腾讯的动作好快,2010年3月5日19时28分58秒,QQ同时在线人数1亿!刚刚看到编辑发布的文章,相差才2分钟,然后连专题页面都做出来了,他们早就预料到了吧?(其实,每人赠送10Q币,轻轻松松上两亿!)