搜索+贪心
因为要有解,所以把给出的置换连边形成的图一定是若干简单偶环。
然后想了半天贪心,发现什么策略都找不到……
考虑爆搜,直接搜索是O(2n2n)的,注意到如果环大小为2则一定前一个是左括号,因此只要枚举长度至少4的环,这样O(2n4n),就能过了。
#include<cstdio>
#include<cstdlib>
#define N 105
using namespace std;
namespace runzhe2000
{
int n, p[N], vis[N], bel[N], type[N], siz[N], cnt;
int check()
{
int s = 0;
for(int i = 1; i <= n; i++)
{
s += (type[i]^vis[bel[i]])?1:-1;
if(s < 0) return 0;
}
return 1;
}
void dfs(int x)
{
if(x > cnt)
{
if(check())
{
for(int i = 1; i <= n; i++) printf("%c",type[i]^vis[bel[i]]?'(':')');
puts(""); exit(0);
}
return;
}
vis[x] = 1, dfs(x+1);
if(siz[x] > 2) vis[x] = 0, dfs(x+1);
}
void main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",&p[i]);
for(int i = 1; i <= n; i++) if(!bel[i])
{
siz[bel[i] = ++cnt] = 1;
for(int j = p[i], k = 1; j != i; j = p[j], k = 1-k)
type[j] = k, bel[j] = cnt, siz[cnt]++;
}
dfs(1);
}
}
int main()
{
runzhe2000::main();
}