我可以大喊一声这就是个SB题吗?

首先讲一句如果你像神仙CXR一样精通搜索你就可以得到\(80pts\)(无Subtask)的好成绩

我们考虑挖掘一下题目的性质,首先发现这是一个置换,那么我们发现这的显然会成环

然后我们发现那个度数的性质其实就是告诉你环上的点必须左右括号相间

换而言之一个环其实只有两种状态,那么我们对于每一个环进行搜索的复杂度显然就是\(O(2^{\frac{n}{2}}n)\)

那么考虑\(n=100\)要怎么卡过去。我们发现一个长度为\(2\)的环显然必须令前面的为左括号,后面为右括号

然后细细分析一下复杂度,这样只用长度\(\ge4\)的环需要搜索状态,那么复杂度就是\(2^{\frac{n}{4}} n\),足以通过此题

CODE

#include<cstdio>
#include<vector>
#include<cstdlib>
#define RI register int
#define CI const int&
using namespace std;
const int N=105;
int n,x,cur,p[N],col[N],sz[N]; vector <int> v[N]; bool c[N];
inline void check(int pfx=0)
{
RI i; for (i=1;i<=n;++i)
{
pfx+=c[i]?-1:1; if (pfx<0) return;
}
for (i=1;i<=n;++i) putchar(c[i]?')':'('); exit(0);
}
inline void DFS(CI nw)
{
if (nw>cur) return check(); if (sz[nw]==2)
return (void)(c[v[nw][0]]=0,c[v[nw][1]]=1,DFS(nw+1));
RI i; for (i=0;i<sz[nw];++i) c[v[nw][i]]=i&1; DFS(nw+1);
for (i=0;i<sz[nw];++i) c[v[nw][i]]=(i&1)^1; DFS(nw+1);
}
int main()
{
//freopen("C.in","r",stdin); freopen("C.out","w",stdout);
RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&p[i]);
for (i=1;i<=n;++i) if (!col[i])
{
for (x=i,++cur;!col[x];x=p[x])
col[x]=cur,v[cur].push_back(x),++sz[cur];
}
return DFS(1),0;
}

LOJ #6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案的更多相关文章

  1. loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...

  2. 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    感觉有点假 题目大意 数据范围:$n<=100$ 题目分析 由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态. 主要是复杂度分析这里: 一元环:不存在 二元环:特判保平安 三元环:不存 ...

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

    传送门:https://loj.ac/problem/6043 [题解] 我们考虑这是个置换,所以一定形成了很多不相交的环. 对于每个环,我们只能选一段.不选.选一段.不选这样交替下去. 显然只有偶环 ...

  4. 【LOJ6043】「雅礼集训 2017 Day7」蛐蛐国的修墙方案(搜索技巧题)

    点此看题面 大致题意: 给你一个长度为\(n\)的排列\(p\),要求构造一个合法的括号序列,使得如果第\(i\)个位置是左括号,则第\(p_i\)个位置一定是右括号. 暴搜 很容易想出一个暴搜. 即 ...

  5. 【刷题】LOJ 6041 「雅礼集训 2017 Day7」事情的相似度

    题目描述 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的有相同的事情发 ...

  6. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度

    我可以大喊一声这就是个套路题吗? 首先看到LCP问题,那么套路的想到SAM(SA的做法也有) LCP的长度是它们在parent树上的LCA(众所周知),所以我们考虑同时统计多个点之间的LCA对 树上问 ...

  7. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)

    题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...

  8. LOJ #6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相

    我可以大喊一声这就是个思博题吗? 首先如果你能快速把握题目的意思后,就会发现题目就是让你求出每个点要成为树的重心至少要嫁接多少边 先说一个显然的结论,重心的答案为\(0\)(废话) 然后我们考虑贪心处 ...

  9. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+启发式合并)

    题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就 ...

随机推荐

  1. kafka基础知识点

    1.安装: 1.1. 前置安装要求:java + zookeeper 1.2. 下载安装包:http://mirros.cnnic.cn/apache/kafka/0.9.00/kafka_2.10- ...

  2. Math类中round、ceil和floor方法的功能

    Java中的Math工具类用来完成除+.-.*./.%等基本运算以外的复杂运算,位于java.lang包下,Math类的构造器全是私有的(private),因此无法创建Math类的对象,Math类的方 ...

  3. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

  4. Postman:传递的参数是List类型时 传参格式的写法

    Postman传递的参数是List类型 实体类中引用了一个List,泛型为其他实体类 参数是List集合时,Postman中参数格式如下图所示: 有不明白的地方,欢迎留言

  5. java SE Development kit 8 Update 201 (64-bit) 的安装相关

    登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型   1.6(JDK6.0) à ...

  6. KeyboardUtil【软键盘弹出后输入框上移一定的高度】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 演示获取软键盘高度并保存,然后根据输入框的原有位置是否被软键盘挡住了,如果被挡住了则将整体页面上移一定的高度,当软键盘隐藏的时候再下 ...

  7. Python的线程池

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Pytho ...

  8. Python自省

    自省就是通过一定机制查询到对象的内部结构,也就是运行时获取对象内部的属性以及类型,在Python中dir(),type(), hasattr(), isinstance()都是很好的自省例子 #!/u ...

  9. 一套代码小程序&Web&Native运行的探索04——数据更新

    接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  10. 面试被问烂的 Spring IOC(求求你别再问了)

    广义的 IOC IoC(Inversion of Control) 控制反转,即"不用打电话过来,我们会打给你". 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 D ...