1 solutions

  • 0
    @ 2024-12-5 18:19:40

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,q,f[302],a[302];
    bool find(int x,int y){ //找x,当前为y
    	if(!y&&x) return 0;
    	if(f[y]==x) return 1;
    	return find(x,f[y]);
    }
    bool chk(int x){ //判断如果以x为管理员满不满足要求
    	for(int i=1;i<=m;i++){
    		if(!find(x,a[i])&&a[i]!=x) return 0;
    	}
    	return 1;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<n;i++) scanf("%d",&f[i]);
    	scanf("%d",&q);
    	while(q--){
    		scanf("%d",&m);
    		for(int i=1;i<=m;i++) scanf("%d",&a[i]);
    		for(int i=n-1;i>=0;i--){ //从后往前遍历
    			if(!i) puts("0"); //只能是老板了,特判一下会更快
    			else if(chk(i)){
    				printf("%d\n",i);
    				break;
    			}
    		}
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    9173
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By