2 条题解

  • 0
    @ 2026-8-15 9:05:15

    那个神人想出来的玄学复杂度啊?

    #include<bits/stdc++.h>
    using namespace std;
    const int N=210;
    int c[N],a[N][N],cnt,nxt[N],v[N],siz[N],n;
    void dfs1(int x)
    {
    	if(v[x])return ;v[x]=1;
    	a[cnt][++siz[cnt]]=x;
    	dfs1(nxt[x]);
    }
    void check()
    {
    	int sum=0;
    	for(int i=1;i<=n;i++)
    	{
    		sum+=(c[i]?1:-1);
    		if(sum<0)return ;
    	}
    	for(int i=1;i<=n;i++)cout<<(c[i]?'(':')');
    	exit(0);
    }
    void dfs2(int x)
    {
    	if(x==cnt+1)
    	{
    		check();
    		return;
    	}
    	if(siz[x]==2)
    	{
    		int l=a[x][1],r=a[x][2];if(l>r)swap(l,r);
    		c[l]=1,c[r]=0;
    		dfs2(x+1);
    		return;
    	}
    	for(int i=1;i<=siz[x];i++)c[a[x][i]]=(i&1);
    	dfs2(x+1);
    	for(int i=1;i<=siz[x];i++)c[a[x][i]]^=1;
    	dfs2(x+1);
    }
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>nxt[i];
    	for(int i=1;i<=n;i++)if(!v[i])cnt++,dfs1(i);
    	dfs2(1);
    	return 0;
    }
    • 0
      @ 2026-8-14 11:29:39

      #include <cstdio>
      
      #define rep(i,_l,_r) for(register signed i=(_l),_end=(_r);i<=_end;++i)
      #define fep(i,_l,_r) for(register signed i=(_l),_end=(_r);i>=_end;--i)
      #define print(x,y) write(x),putchar(y)
      
      template <class T> inline T read(const T sample) {
          T x=0; int f=1; char s;
          while((s=getchar())>'9'||s<'0') if(s=='-') f=-1;
          while(s>='0'&&s<='9') x=(x<<1)+(x<<3)+(s^48),s=getchar();
          return x*f;
      }
      template <class T> inline void write(const T x) {
          if(x<0) return (void) (putchar('-'),write(-x));
          if(x>9) write(x/10);
          putchar(x%10^48);
      }
      
      #include <vector>
      #include <cstdlib>
      using namespace std;
      
      const int maxn=105;
      
      vector <int> g[maxn];
      int n,p[maxn],cnt,siz[maxn];
      bool vis[maxn],co[maxn];
      
      void FindCircle(int u,int id) {
      	if(vis[u]) return;
      	g[id].push_back(u); vis[u]=1; ++siz[id];
      	FindCircle(p[u],id);
      }
      
      void ok() {
      	int tot=0;
      	rep(i,1,n) {
      		tot+=(co[i]?-1:1);
      		if(tot<0) return;
      	}
      	rep(i,1,n) putchar(co[i]?')':'('); puts("");
      	exit(0);
      }
      
      void dfs(int x) {
      	if(x>cnt) return ok();
      	if(siz[x]==2) {
      		co[g[x][0]]=0,co[g[x][1]]=1;
      		dfs(x+1);
      		return;
      	} 
      	rep(i,0,g[x].size()-1) co[g[x][i]]=(i&1); dfs(x+1);
      	rep(i,0,g[x].size()-1) co[g[x][i]]=(!(i&1)); dfs(x+1);
      }
      
      int main() {
      	n=read(9);
      	rep(i,1,n) p[i]=read(9);
      	rep(i,1,n)
      		if(!vis[i]) FindCircle(i,++cnt);
      	dfs(1);
      	return 0;
      }
      
      
      • 1

      「雅礼集训 2017 Day7」蛐蛐国的修墙方案

      信息

      ID
      10101
      时间
      2000ms
      内存
      1024MiB
      难度
      9
      标签
      递交数
      12
      已通过
      4
      上传者