Bicolored RBS
time limit per test 2 seconds
memory limit per test 256 megabytes
题目链接http://codeforces.com/problemset/problem/1167/D
题目大意:给你一个正确的括号序列,让你染两种颜色,使得这两种颜色的括号序列的最大嵌套深度最小。比如题目的(())嵌套深度为2,可以将其染成2种颜色使得每种颜色的嵌套深度为1:()+()
实际上样例很有迷惑性,我们可以直接将嵌套深度为最大深度/2以上的(包含)染成一种颜色,其余的染成另一种颜色,这样一来如果它本身的最大嵌套深度为偶数就刚好平分,否则的话也是一半-1和一半+1,也是最小的分法。
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
const int mac=2e5+10;
char s[mac];
int a[mac];
int main()
{
int n;
scanf ("%d",&n);
scanf ("%s",s+1);
a[1]=1;
int ma=0;
for (int i=2; i<=n; i++){//计算每个括号的嵌套深度
if (s[i]=='('){
if (s[i-1]=='(') a[i]=a[i-1]+1;
else a[i]=a[i-1];
}
else {
if (s[i-1]=='(') a[i]=a[i-1];
else a[i]=a[i-1]-1;
}
ma=max(ma,a[i]);//取最大的嵌套深度
}
//for (int i=1; i<=n; i++) printf ("%d ",a[i]);
int lim=ma;
ma/=2;
ma--;
ma=lim-ma;
for (int i=1; i<=n; i++){
//if (a[i]==1) printf ("0");
if (a[i]>=ma) printf ("0");
else printf ("1");
}
printf ("\n");
return 0;
}