結果
| 問題 |
No.2145 Segment +-
|
| コンテスト | |
| ユーザー |
nono00
|
| 提出日時 | 2022-12-29 19:38:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 95 ms / 2,000 ms |
| コード長 | 2,060 bytes |
| コンパイル時間 | 728 ms |
| コンパイル使用メモリ | 73,644 KB |
| 最終ジャッジ日時 | 2025-02-09 21:57:22 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void print(const T t, bool ln = true) {
cout << t;
if (ln) {
cout << '\n';
} else {
cout << ' ';
}
}
template<typename T>
void printv(const vector<T> &v) {
for (int i = 0; i < (int)v.size(); i++) {
print(v[i], false);
}
cout << '\n';
}
template<typename T>
void printvv(const vector<vector<T>> &vv) {
for (int i = 0; i < (int)vv.size(); i++) {
vprint(vv[i]);
}
}
void solve() {
int n;
cin >> n;
string s;
cin >> s;
vector<int> normal(n + 1, 1), reverse(n + 1, 1);
for (int i = 0; i < n; i++) {
if (s[i] == '+') {
reverse[i + 1] = -1;
} else if (s[i] == '-') {
normal[i + 1] = -1;
}
normal[i + 1] += normal[i];
reverse[i + 1] += reverse[i];
}
int now = 0, l = 0, cnt = 0;
while (l < n) {
int r = -1;
for (int i = l + 1; i <= n; i++) {
if (now + normal[i] - normal[l] < 0) {
r = i;
break;
}
}
if (r == -1) {
break;
}
cnt++;
int mx = -1;
for (int m = l; m < r; m++) {
if (mx < now + (normal[m] - normal[l]) + (reverse[r] - reverse[m])) {
mx = now + (normal[m] - normal[l]) + (reverse[r] - reverse[m]);
}
}
now = mx;
l = r++;
for (; r <= n; r++) {
if (now + (reverse[r] - reverse[l]) < 0) {
break;
}
}
if (r == n + 1) {
break;
}
mx = -1;
for (int m = l; m < r; m++) {
if (mx < now + (reverse[m] - reverse[l]) + (normal[r] - normal[m])) {
mx = now + (reverse[m] - reverse[l]) + (normal[r] - normal[m]);
}
}
now = mx;
l = r;
}
cout << cnt << '\n';
}
int main() {
int q = 1;
// cin >> q;
while (q--) {
solve();
}
}
nono00