#2 RE #7,8 TLE
查看原帖
#2 RE #7,8 TLE
224978
optimize_2楼主2021/2/19 09:40

dfs序然后莫队..

#include<bits/stdc++.h>
#define N 200010
using namespace std;

int n,m,x,g[N];
vector<int> s[N];

int cnt,b[N],e[N],a[N];

void dfs(int x) {
	a[++cnt]=x;
	b[x]=cnt;
	for(int i=0;i<s[x].size();i++) dfs(s[x][i]);
	a[++cnt]=x;
	e[x]=cnt;
}

int belong[N];

struct query {
	int id,ans;
	int l,r;
} q[N];

bool cmp1(query a,query b) {
	if(belong[a.l]=belong[b.l]) return a.r<b.r;
	else return belong[a.l]<belong[b.l];
}
bool cmp2(query a,query b) {
	return a.id<b.id;
}

int l,r,ans;
int vst[N];
void addl() {
	vst[g[a[l]]]--;
	if(vst[g[a[l]]]==0) ans--;
	l++;
}
void minl() {
	l--;
	vst[g[a[l]]]++;
	if(vst[g[a[l]]]==1) ans++;
}
void addr() {
	r++;
	vst[g[a[r]]]++;
	if(vst[g[a[r]]]==1) ans++;
}
void minr() {
	vst[g[a[r]]]--;
	if(vst[g[a[r]]]==0) ans--;
	r--;
}

int main() {
	scanf("%d",&n);
	int sqt=sqrt(n);
	for(int i=1;i<=n;i++) belong[i]=(i-1)/sqt+1;
	//for(int i=1;i<=n;i++) cout<<belong[i]<<" ";
	for(int i=2;i<=n;i++) {
		scanf("%d",&x);
		s[x].push_back(i);
	}
	for(int i=1;i<=n;i++) {
		cin>>g[i];
	}
	dfs(1);
	//for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";
	//cout<<endl;
	for(int i=1;i<=n;i++) {
		q[i].l=b[i];
		q[i].r=e[i];
		q[i].id=i;
		//cout<<"**"<<q[i].id<<" "<<q[i].l<<" "<<q[i].r<<"**\n";
	}
	sort(q+1,q+n+1,cmp1);
	for(int i=1;i<=n;i++) {
		while(l<q[i].l) addl();
		while(l>q[i].l) minl();
		while(r<q[i].r) addr();
		while(r>q[i].r) minr();
		q[i].ans=ans;
		//cout<<"**"<<q[i].id<<" "<<q[i].l<<" "<<q[i].r<<" "<<l<<" "<<r<<" "<<ans<<"**\n";
	}
	sort(q+1,q+n+1,cmp2);
	scanf("%d",&m);
	for(int i=1;i<=m;i++) {
		scanf("%d",&x);
		cout<<q[x].ans<<endl;
	}
}
2021/2/19 09:40
加载中...