正解:搜索
解题报告:
首先由$p_i$是一个序列得,每个点的度数为2.且一定形成若干个环.
考虑先对每个环做,发现若要有解必须是偶环,且一定是隔一条边选一条边的,所以对每个环其实只有2种方案.
这时候搜索的复杂度是$O(2^{frac{n}{2}})$.依然是过不去的.
继续考虑.发现如果环长为2,显然在左侧放左括号不会更劣(显然不解释了$QwQ$,于是复杂度就被降到了$O(2^{frac{n}{4}})$,就做完辣辣辣辣辣!
#include<bits/stdc++.h> using namespace std; #define il inline #define lf double #define gc getchar() #define mp make_pair #define ri register int #define rc register char #define rb register bool #define lowbit(x) (x&(-x)) #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) const int N=100+10; int n,p[N],cnt,ch[N]; bool vis[N]; vector<int>V[N]; il int read() { rc ch=gc;ri x=0;rb y=1; while(ch!='-' && (ch>'9' || ch<'0'))ch=gc; if(ch=='-')ch=gc,y=0; while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc; return y?x:-x; } il void check() { ri sum=0; rp(i,1,n){sum+=ch[i];if(!(~sum))return;} rp(i,1,n)printf("%c",~ch[i]?'(':')');;exit(0); } void dfs(ri nw) { if(nw>cnt){check();return;} ri sz=V[nw].size(); rp(i,0,sz-1)if(i&1)ch[V[nw][i]]=-1;else ch[V[nw][i]]=1;;dfs(nw+1); rp(i,0,sz-1)ch[V[nw][i]]=-ch[V[nw][i]];;dfs(nw+1); } int main() { //freopen("6043.in","r",stdin);freopen("6043.out","w",stdout); n=read();rp(i,1,n)p[i]=read(); rp(i,1,n) if(!vis[i]) { ri nw=i;++cnt; while(!vis[nw])vis[nw]=1,V[cnt].push_back(nw),nw=p[nw]; if(V[cnt].size()==2){ch[V[cnt][0]]=1,ch[V[cnt][1]]=-1;V[cnt].clear();--cnt;} } dfs(1); return 0; }