社区讨论
玄关,10分铅条
P5658[CSP-S 2019] 括号树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0qerr
- 此快照首次捕获于
- 2025/11/03 18:49 4 个月前
- 此快照最后确认于
- 2025/11/03 18:49 4 个月前
10分DP不知道为什么错(下有数据)
CPP#include <bits/stdc++.h>
using namespace std;
const int N=200010;
long long n,a[N],sr,p[N];
long long ts1;
char opt;
vector<long long> edge[N];
long long jl[N],lian[N],dp[N];
long long ed,he;
long long ans;
bool flag;
void dfs(long long now){
dp[now]=dp[jl[ed]];
flag=1;
if(he>0){
if(a[jl[he]]==0&&a[now]==1){
p[ed+1]=he;
dp[now]+=lian[he-1];
++dp[now];
jl[++ed]=now;
lian[ed]=1+lian[he-1];
ans=(ans^(now*dp[now]));
he=(he-1)-2*lian[he-1];
flag=0;
}
}
if(flag){
jl[++ed]=now;
lian[ed]=0;
p[ed]=0;
he=ed;
ans=(ans^(now*dp[now]));
}
for(long long to:edge[now]){
dfs(to);
}
if(p[ed]){
he=p[ed];
}
else{
--he;
if(p[he]){
he=he-lian[he]*2;
}
}
p[ed]=0;
lian[ed]=0;
jl[ed]=0;
--ed;
return ;
}
int main(){
// freopen("brackets.in","r",stdin);
// freopen("brackets.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(long long i=1;i<=n;++i){
cin>>opt;
a[i]=((opt=='(')?0:1);
}
for(long long i=2;i<=n;++i){
cin>>sr;
edge[sr].push_back(i);
}
dfs(1);
cout<<ans;
return 0;
}
输入:
CPP50
))()(())((((()))))))((())))()))((()(()((((((())())
1 2 1 2 2 6 6 6 6 10 10 10 7 13 13 10 13 15 18 18 20 17 19 10 25 26 27 25 25 25 31 29 30 34 25 34 29 25 30 39 38 41 34 36 35 43 44 25 44
输出:
CPP234
答案:
CPP160
回复
共 0 条回复,欢迎继续交流。
正在加载回复...