Successor

线段树
map离散化,按照能力值排序建立更新节点,区间查询(单点更新)

for (int i=1;i<=n-1;i++)
	   {  scanf("%d%d%d",&fa,&peo[i].loty,&peo[i].abty);
	      peo[i].id=i;
		  son[fa].push_back(i);
		  D[peo[i].loty]=i; 
		}	

离散化

cmp排序(能力相同返回序号小的)

bool cmp(node A,node B){
  if (A.abty==B.abty) return A.id<B.id;
     else return A.abty>B.abty;	
}

单点更新

void update(int k,int val,int rt,int l,int r){
	if (l==r) {
		tree[rt]=val;return;
	}
	int mid=(l+r)>>1;
	if (k<=mid) update(k,val,rt<<1,l,mid);
	else update(k,val,rt<<1|1,mid+1,r);
	tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
} 
区间查询
int ask(int L,int R,int rt,int l,int r){
	if (L>R) return -1;
	if (L<=l&&r<=R) return tree[rt];
    int mid=(l+r)>>1,ansl=-1,ansr=-1;
    if (L<=mid) ansl=ask(L,R,rt<<1,l,mid);
    if (R>mid) ansr=ask(L,R,rt<<1|1,mid+1,r);
    return max(ansl,ansr);
}

dfs序树
今天刚学了taijian,还是挺好理解的(vector写法)

void dfs(int u)
{
	L[u]=tot++;
	for (int i=0;i<son[u].size();i++) dfs(son[u][i]);
	R[u]=tot;
}

邻接表写法

void dfs(int u)
{
l[u]=tot++;
for (int i=head[u];i;i=e[i].nxt)
     {
     int v=e[i].to;
       dfs(v); 
     }
    r[u]=tot;
}

ans 边处理边记录,化查询为离线

dfs(0);
	  sort(peo+1,peo+n,cmp);//按能力值排序
	  for (int i=1;i<n;i++){
	  	int id=peo[i].id;
	  	update(L[id],peo[i].loty,1,0,n-1);
	  	if (son[id].size()==0){
	  		ans[id]=-1;
	  		continue;
		  }
		int s=ask(L[id]+1,R[id]-1,1,0,n-1);
		if (s!=-1) ans[id]=D[s];
		  else ans[id]=-1;
	  }
全部评论

相关推荐

04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务