結果
| 問題 | No.3652 Range Bracket Sequence |
| コンテスト | |
| ユーザー |
pengin_2000
|
| 提出日時 | 2026-08-28 23:06:39 |
| 言語 | C (gcc 15.2.0) |
| 結果 |
AC
|
| 実行時間 | 325 ms / 2,000 ms |
| + 471µs | |
| コード長 | 1,788 bytes |
| 記録 | |
| コンパイル時間 | 281 ms |
| コンパイル使用メモリ | 39,296 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-08-28 23:06:55 |
| 合計ジャッジ時間 | 13,840 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 57 |
ソースコード
#include<stdio.h>
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
int seg[800005], lazy[800005], ss;
void eval(int k)
{
seg[k] += lazy[k];
if (k < ss - 1)
{
lazy[2 * k + 1] += lazy[k];
lazy[2 * k + 2] += lazy[k];
}
lazy[k] = 0;
return;
}
void update(int a, int b, int d, int k, int l, int r)
{
eval(k);
if (a <= l && r <= b)
{
lazy[k] += d;
eval(k);
}
else if (a < r && l < b)
{
update(a, b, d, 2 * k + 1, l, (l + r) / 2);
update(a, b, d, 2 * k + 2, (l + r) / 2, r);
seg[k] = min(seg[2 * k + 1], seg[2 * k + 2]);
}
return;
}
int get(int a, int b, int k, int l, int r)
{
eval(k);
if (r <= a || b <= l)
return 1e9;
else if (a <= l && r <= b)
return seg[k];
else
{
int res1, res2;
res1 = get(a, b, 2 * k + 1, l, (l + r) / 2);
res2 = get(a, b, 2 * k + 2, (l + r) / 2, r);
return min(res1, res2);
}
}
char s[200005];
int main()
{
int n, q;
scanf("%d %d", &n, &q);
int i;
scanf("%s", s);
for (ss = 1; ss <= n; ss *= 2);
for (i = 0; i < 2 * ss - 1; i++)
{
seg[i] = 0;
lazy[i] = 0;
}
int d;
char c;
for (i = 0; i < n; i++)
{
if (s[i] == '(')
d = 1;
else
d = -1;
update(i + 1, n + 1, d, 0, 0, ss);
}
int type, x, t, l, r;
int left, right, ans;
for (; q > 0; q--)
{
scanf("%d", &type);
if (type == 1)
{
scanf("%d %d", &x, &t);
x--;
if (t == 1)
c = '(';
else
c = ')';
if (s[x] != c)
{
s[x] = c;
d = 3 - 2 * t;
update(x + 1, n + 1, 2 * d, 0, 0, ss);
}
}
else
{
scanf("%d %d", &l, &r);
right = get(r, r + 1, 0, 0, ss);
left = get(l - 1, l, 0, 0, ss);
d = get(l - 1, r + 1, 0, 0, ss);
ans = left + right - 2 * min(left, right);
ans += 2 * (min(left, right) - d);
ans = r - l + 1 - ans;
printf("%d\n", ans);
}
}
return 0;
}
pengin_2000