RE求助
查看原帖
RE求助
217634
anonymous217楼主2023/10/12 17:21
//数组故意开大了
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
	int ls,rs,siz;
}t[N];
int n,x,root[N],a[N],b[N],tot;
vector<int>emp[N];
int dfn[N],_end[N],dfnr[N],dfnt;
void dfs(int cur)
{
    dfn[cur]=++dfnt;dfnr[dfnt]=cur;
    for(int i=0;i<emp[cur].size();i++)
    {
        int to=emp[cur][i];
        dfs(to);
    }
    _end[cur]=dfnt;
}
void push_up(int cur)
{
	t[cur].siz=t[t[cur].ls].siz+t[t[cur].rs].siz;
}
int build(int lt,int rt)
{
	int cur=++tot;
	t[cur].siz=0;
	if(lt==rt)
	{
		return cur;
	}
	int mid=(lt+rt)>>1;
	t[cur].ls=build(lt,mid);
	t[cur].rs=build(mid+1,rt);
	return cur;
}
int query(int curl,int curr,int lt,int rt,int val)
{
    if(val<lt)
        return 0;
    if(rt<=val)
        return t[curr].siz-t[curl].siz;
    int mid=(lt+rt)>>1;
    return query(t[curl].ls,t[curr].ls,lt,mid,val)+query(t[curl].rs,t[curr].rs,mid+1,rt,val);
}
int upd(int cur,int lt,int rt,int loc)
{
	int np=++tot;t[np]=t[cur];
	if(lt==rt)
	{
		t[np].siz++;
		return np;
	}
	int mid=(lt+rt)>>1;
	if(loc<=mid)t[np].ls=upd(t[np].ls,lt,mid,loc);
	else t[np].rs=upd(t[np].rs,mid+1,rt,loc);
	push_up(np);
	return np;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);cin>>n;
	for(int i=1;i<=n;i++)
        cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
    int len=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(b+1,b+len+1,a[i])-b;
    for(int i=2;i<=n;i++)
        cin>>x,emp[x].push_back(i);
    dfs(1);root[0]=build(1,len);
    for(int i=1;i<=n;i++)
        root[i]=upd(root[i-1],1,len,a[dfnr[i]]);	
	for(int i=1;i<=n;i++)
        cout<<_end[i]-dfn[i]+1-query(root[dfn[i]-1],root[_end[i]],1,len,a[i])<<"\n";
	return 0;
}
2023/10/12 17:21
加载中...