求调
查看原帖
求调
1123756
____QAQ____楼主2025/8/29 18:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
vector<int> e[500001];
int f[500001];
int value[500001];
int ans[500001];//以i结尾
void dfs(int x,queue<pair<int,int> > q){
    if(value[f[x]]==0&&value[x]==1){
        ans[x]=ans[f[f[x]]]+1;}
    else if(value[x]==1){
        if(!q.empty()&&q.front().first==0){
            ans[x]=ans[f[q.front().second]]+1;
        }
    }
    if(!q.empty()){
        if(q.front().first==0&&value[x]==1)q.pop();
        else q.push(make_pair(value[x],x));
    }
    else q.push(make_pair(value[x],x));
    //cout<<x<<" "<<ans[x]<<endl;
    for(int i=0;i<e[x].size();i++){
        dfs(e[x][i],q);
    }
    return ;
}
int SUM[500001];
void getans(int x,int sum){
    SUM[x]=x*(sum+ans[x]);
    for(int i=0;i<e[x].size();i++){
        getans(e[x][i],sum+ans[x]);
    }
    return ;
}
signed main(){
    cin>>n;
    memset(value,-1,sizeof value);
    for(int i=1;i<=n;i++){
        char op;
        cin>>op;
        if(op=='(')value[i]=0;
        else value[i]=1;
    }
    for(int i=1;i<n;i++){
        cin>>f[i+1];
        e[f[i+1]].push_back(i+1);
    }
    queue<pair<int,int> > empty;
    dfs(1,empty);
    getans(1,0);
    int fine=SUM[1];
    for(int i=2;i<=n;i++){
        fine=fine^SUM[i];
    }
    cout<<fine;
    return 0;
}
2025/8/29 18:25
加载中...