题意:
有一个由上下级关系构成的树...如果开除一个人..那么从他的子树里找一个能力比他强..并且忠诚度最高的(注意..不是比他高)..问若开除谁,,谁来顶替(注意..不是连续的过程..都是单独的...)
题解:
完全2B了...读题各种错误..连ability和loyalty的读入都搞反..然后是忠诚度的要求搞错..排序的时候少考虑了(能力相等..父节点在子节点前面)...写线段树的时候又犯些2B的错误..而且还莫名其妙的爆栈....只带一个参数走..dfs里也只定义了一个参数..这也能爆栈?没办法..只能前面加申请栈空间代码...这题要把我做蒙了..还好提交十多次终于AC了..思路一开始就没错...真是蛋疼...
题解思路很简单...离线打表..O(1)输出...为了方便线段树的查询..找出该树的后序遍历(DFS回朔标记即可...)..发现其孩子都在他左边的某一片区域...一颗二维的树就变成了一个一维的...用线段树点更新.区间查找最大值就好...每个staff按能力大小的顺序往线段树里添加..每次找他孩子所在区间的忠诚最大值..由于放入的时候保证了是按能力大小..也就是当本staff查询时..线段树中所存在staff的能力都比他大..所以只要找区间忠诚度最高的...
Program:
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<stdio.h> #include<cmath> #include<queue> #include<stack> #include<string.h> #include<map> #include<set> #include<algorithm> #define oo 1000000007 #define MAXN 50005 #define ll int using namespace std; struct node { int a,b,l,id; }s[MAXN]; struct LINE { int x,y,next; }line[MAXN]; int Max[MAXN<<2],_next[MAXN]; int hash[1000005],ans[MAXN],dfn[MAXN],Lnum,N,num; bool cmp(node a,node b) { if (a.b!=b.b) return a.b>b.b; return dfn[a.id]>dfn[b.id]; } void addline(int x,int y) { line[++Lnum].next=_next[x],_next[x]=Lnum; line[Lnum].x=x,line[Lnum].y=y; } void dfs(int x) { s[x].l=oo; for (int k=_next[x];k;k=line[k].next) { dfs(line[k].y); s[x].l=min(s[x].l,s[line[k].y].l); } dfn[x]=num,s[x].l=min(s[x].l,num); num++; } void update(int p,int c,int l,int r,int now) { if (l==r) { Max[now]=c; return; } int mid=l+r>>1; if (p<=mid) update(p,c,l,mid,now<<1); if (p>mid) update(p,c,mid+1,r,now<<1|1); Max[now]=max(Max[now<<1],Max[now<<1|1]); } int query(int L,int R,int l,int r,int now) { if (L<=l && R>=r) return Max[now]; int mid=l+r>>1,ans=-oo; if (L<=mid) ans=max(ans,query(L,R,l,mid,now<<1)); if (R>mid) ans=max(ans,query(L,R,mid+1,r,now<<1|1)); return ans; } int main() { int cases,i,x,Q; scanf("%d",&cases); while (cases--) { scanf("%d%d",&N,&Q); memset(_next,0,sizeof(_next)),Lnum=0; for (i=1;i<N;i++) { scanf("%d%d%d",&x,&s[i].a,&s[i].b); hash[s[i].a]=i,s[i].id=i; addline(x,i); } s[0].a=s[0].b=oo; s[0].id=0; num=0; dfs(0); sort(s,s+N,cmp); memset(Max,-0x3f,sizeof(Max)); for (i=0;i<N;i++) { x=query(s[i].l,dfn[s[i].id],0,N-1,1); if (x<0) ans[s[i].id]=-1; else ans[s[i].id]=hash[x]; update(dfn[s[i].id],s[i].a,0,N-1,1); } while (Q--) { scanf("%d",&x); printf("%d\n",ans[x]); } } return 0; }