zoukankan      html  css  js  c++  java
  • 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    感觉有点假

    题目大意

    数据范围:$n<=100$


    题目分析

    由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态。

    主要是复杂度分析这里:

    一元环:不存在

    二元环:特判保平安

    三元环:不存在

    四元环:复杂度$O(2^{25})$,但是特判一下顺序就可以秒下来了

    六元环:复杂度$O(2^{17})$至此及以后的复杂度都是可以接受的了

    不知道为什么倒着搜就会更快?

     1 #include<bits/stdc++.h>
     2 const int maxn = 103;
     3 
     4 int n,las,p[maxn],w[maxn],deg[maxn];
     5 
     6 void dfs(int x)
     7 {
     8     if (x==0){
     9         if (las) return;
    10         for (int i=1; i<=n; i++)
    11             putchar(w[i]?'(':')');
    12         exit(0);
    13     }
    14     if (w[x]!=-1){
    15         int che = w[p[x]];
    16         if (w[p[x]]!=-1&&((1-w[x])!=w[p[x]])) return;
    17         w[p[x]] = 1-w[x];
    18         las -= w[x]?1:-1;
    19         if (las >= 0) dfs(x-1);
    20         las += w[x]?1:-1;
    21         w[p[x]] = che;
    22     }else{
    23         w[x] = 1;
    24         int che = w[p[x]], chk = 1;
    25         for (int i=p[x],f=w[x]; i!=x; i=p[i])
    26             f = 1-f, chk &= (w[i]==-1)||(f==w[i]);
    27         if (chk){
    28             int bck[maxn],bct = 0;
    29             for (int i=p[x],f=w[x]; i!=x; i=p[i])
    30                 f = 1-f, bck[++bct] = w[i], w[i] = f;
    31             las -= w[x]?1:-1;
    32             if (las >= 0) dfs(x-1);
    33             las += w[x]?1:-1;
    34             for (int i=p[x],f=1; i!=x; i=p[i])
    35                 w[i] = bck[f], ++f;
    36         }
    37         
    38         w[x] = 0;
    39         che = w[p[x]];
    40         if (w[p[x]]==-1||((1-w[x])==w[p[x]])){
    41             w[p[x]] = 1-w[x];
    42             las -= w[x]?1:-1;
    43             if (las >= 0) dfs(x-1);
    44             las += w[x]?1:-1;
    45             w[p[x]] = che;
    46         }
    47         
    48         w[x] = -1;
    49     }
    50 }
    51 int main()
    52 {
    53     memset(w, -1, sizeof w);
    54     scanf("%d",&n);
    55     for (int i=1; i<=n; i++) scanf("%d",&p[i]), ++deg[p[i]];
    56     dfs(n);
    57     return 0;
    58 }

    END

  • 相关阅读:
    [原创]网页级在线性能测试网站介绍
    [原创]浅谈测试团队文化
    [原创]浅谈自动化测试中的金字塔模型理解
    [原创]如何在面试时选择合适的测试人员?
    [原创]浅谈怎么写周报
    [原创]Windows下调试工具介绍
    [原创]浅谈我对持续集成的理解
    [原创]IBM AppScan工具培训
    [原创]Jenkins持续集成工具介绍
    [原创]什么是信息安全资产管理?
  • 原文地址:https://www.cnblogs.com/antiquality/p/10673503.html
Copyright © 2011-2022 走看看