求 hack
查看原帖
求 hack
823773
_sh1kong_楼主2024/1/28 21:52

RT,赛时造了好几组数据都没有问题,但是交上去 0pts0 pts。。。

#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();
}
2024/1/28 21:52
加载中...