RT,赛时造了好几组数据都没有问题,但是交上去 0pts。。。
#include <bits/stdc++.h>
#define int long long
#define LL long long
#define I ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define mem(a, v) memset(a, v, sizeof a)
#define re read()
const int N = 3e6 + 7, M = 16;
using namespace std;
inline LL read()
{
int num = 0;char c;bool flag = false;
while((c = getchar()) == ' ' || c == '\n' || c == '\r');
if(c == '-') flag = true;else num = c - '0';
while(isdigit(c = getchar())) num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
}
const int mod = 998244353, inf = 0x3f3f3f3f3f3fll;
int n;
char s[N];
int a[N];
//10000
//00001
#define PII pair <int, int>
int dp[N];
bool chk(char x, char y)
{
if (y == '(' && x == ')') return 0;
else return 1;
}
void Subtask1()
{
//(()())
//()()()()
//
int Result = 0, Ans = 0;
stack <PII> st;
for (int i = 1; i <= n; i ++ )
{
if (st.empty() || chk(s[i], st.top().first))
{
st.push({s[i], i});
dp[i] = max(0LL, dp[i - 1]);
}
else
{
PII t = st.top();st.pop();
int T = a[i] - a[t.second];
//cout << i << ' ' << T << '\n';
dp[i] = max(dp[i - 1], dp[t.second] + T);
dp[i] = max(dp[i], 0LL);
//dp[i] = max
//(()())
//1 1 2 2 3 5
}
//cout << dp[i] << ' ';
}
cout << dp[n];
/*
6
()((()
1 1 3 2 5 6
6
()()()
1 2 3 4 5 6
*/
}
#undef PII
signed main()
{
I;
cin >> n;
cin >> s + 1;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
Subtask1();
}