社区讨论

玄关,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;
}
输入:
CPP
50

))()(())((((()))))))((())))()))((()(()((((((())())

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

输出:
CPP
234
答案:
CPP
160

回复

0 条回复,欢迎继续交流。

正在加载回复...