关于刚才T2
查看原帖
关于刚才T2
555065
ChrysanthBlossom楼主2024/1/28 18:18

这怎么挂了

找不了一点

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define int long long
#define mkp make_pair
using namespace std;
const int maxn=3e6+7;
int n;
int s[maxn];
bool ilg[maxn];
ll pre[maxn];
ll f[maxn];
int a[maxn];
vector<pair<int,int> >st;
const ll inf=1e13;
ll maxi;
void solve(int l,int r){
//	cout<<l<<' '<<r<<endl;
	for(ri i=0;i<=r-l+1;i++){
		pre[i]=-inf;
	}
	s[l-1]=0;
	for(ri i=l;i<=r;i++){
		s[i]+=s[i-1];
	}
	for(ri i=l;i<=r;i++){
		f[i]=maxi;
		if(s[i]>s[i-1]){
			pre[s[i-1]]=max(pre[s[i-1]],maxi-a[i]);
		}
		else{
			f[i]=max(f[i],pre[s[i]]+a[i]);
		}
		maxi=max(maxi,f[i]);
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(ri i=1;i<=n;i++){
		char t;cin>>t;
		if(t==40)s[i]=1;
		else s[i]=-1;
	}
	for(ri i=1;i<=n;i++){
		if(s[i]==1)st.push_back(mkp(i,1));
		else{
			if(st.size()&&st[st.size()-1].second==1)st.pop_back();
			else st.push_back(mkp(i,-1));
		}
	}
	for(auto x:st){
		ilg[x.first]=1;
//		cout<<x.first<<endl;
	}
	for(ri i=1;i<=n;i++)cin>>a[i];
	for(ri i=1,j=1;i<=n;i=j+1){
		while(ilg[i]&&i<=n)i++;
		if(i>n)break;
		j=i;
		while(!ilg[j+1]&&j+1<=n)j++;
		solve(i,j);
		if(j==n)break;
	}
//	for(ri i=1;i<=n;i++)cout<<s[i]<<' ';cout<<endl;
//	for(ri i=1;i<=n;i++)cout<<f[i]<<' ';cout<<endl;
	cout<<maxi;
	return 0;
}
/*
10
()((())())()())())()
2 4 1 7 3 2 8 4 9 5
*/
2024/1/28 18:18
加载中...