做法一

首先将排列用康托展开映射到整数,并且预处理出排列之间乘法的结果,复杂度 \(\mathcal{O}(k(k!) ^ 2)\).

枚举左端点,有可能分段的右端点至多只有 \(k!\) 个,不妨将这些右端点首先预处理得出。

一个基础的想法是从左往右每次加入一个不在当前集合内的置换然后暴力搜索扩展,这样复杂度至多是 \(\mathcal{O}(nk(k!) ^ 2)\) 的,不能通过。

注意到每次扩展到不能扩展位置得到的所有置换构成 \(S_k\) 的一个子群,有拉格朗日定理可知每次大小都是 \(S_k\) 的约数,因此每次扩展至少会增大一倍。

同时所有扩展得到的置换可以看作是每次加入置换之间做任意乘法得到的,根据上面的性质,这个基底大小只有 \(\mathcal{O}(\log k!) = \mathcal{O}(k \log k)\).

扩展的时候只与基底做乘法,这样复杂度就降至 \(\mathcal{O}(nk!k\log k)\).

做法二

与做法一到暴力扩展之前都是一致的。

我们将一个置换看作是连接若干个置换之间的边,一旦两个置换其一与恒等置换连接,那么这个连通块就是一个子群,因此可以直接连无向边。

那么只需要建出这个图的最小生成树就可以求解贡献了,暴力是 \(\mathcal{O}(n(k!) ^ 2k \log k)\) 的。

考虑利用重复信息,从右往左枚举左端点,每次相当于只加入了 \(\mathcal{O}(k!)\) 条边,与之前最小生成树上的边替换即可,可以直接将原来的边拉出来重建最小生成树,复杂度 \(\mathcal{O}(nk!k \log k)\).

CF1229D - Wojtek and Card Tricks的更多相关文章

  1. Codeforces Round #588 (Div. 1) 简要题解

    1. 1229A Marcin and Training Camp 大意: 给定$n$个对$(a_i,b_i)$, 要求选出一个集合, 使得不存在一个元素好于集合中其他所有元素. 若$a_i$的二进制 ...

  2. Matlab tips and tricks

    matlab tips and tricks and ... page overview: I created this page as a vectorization helper but it g ...

  3. UESTC 890 Card Trick(DP 纸牌魔术)

    题意  给你一些牌  所有正面朝下放桌子上   你选一个起点    翻开那张牌   牌上的数字是几就向前走几步   J,Q,K 都是向前走10步  A向前走11步   知道向前走相应的步数后超过了终点 ...

  4. Lesson 3 Please send me a card

    Text Postcards always spoil my holidays. Last summer, I went to Italy. I visited museums and sat in ...

  5. testng 教程之使用参数的一些tricks配合使用reportng

    前两次的总结:testng annotation生命周期 http://www.cnblogs.com/tobecrazy/p/4579414.html testng.xml的使用和基本配置http: ...

  6. iOS - Card Identification 银行卡号识别

    1.CardIO 识别 框架 GitHub 下载地址 配置 1.把框架整个拉进自己的工程,然后在 TARGETS => Build Phases => Link Binary With L ...

  7. (转) How to Train a GAN? Tips and tricks to make GANs work

    How to Train a GAN? Tips and tricks to make GANs work 转自:https://github.com/soumith/ganhacks While r ...

  8. HDOJ 4336 Card Collector

    容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. Opensuse enable sound and mic card

    Install application pavucontrol Run pavucontrol You will see the configuration about sound card and ...

随机推荐

  1. JVM 内存布局

    JVM 内存布局规定了 Java 在运行过程中内存申请.分配.管理的策略,保证了 JVM 的高效稳定运行. 线程是否共享 Heap (堆区) 堆是 OOM 故障最主要的发生区域.它是内存区域中最大的一 ...

  2. Understanding Black-box Predictions via Influence Functions

    目录 概 主要内容 样本重要性分析 样本摄动对损失的影响 高效计算 共轭梯度 随机估计 一些应用 附录 (1)的证明 Koh P W, Liang P. Understanding black-box ...

  3. 详解Kalman Filter

    中心思想 现有: 已知上一刻状态,预测下一刻状态的方法,能得到一个"预测值".(当然这个估计值是有误差的) 某种测量方法,可以测量出系统状态的"测量值".(当然 ...

  4. [opencv]利用minAreaRect计算平面矩形的旋转角度

    #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include ...

  5. gojs 如何实现虚线(蚂蚁线)动画?

    在绘制 dag 图时,通过节点和来箭头的连线来表示节点彼此之间的关系.而节点常常又带有状态,为了更好的表示节点之间的流程关系,loading 状态的节点,与后续节点之间,需要用 动画着的虚线 表示,表 ...

  6. CGO封装C语言qsort函数

    封装qsort函数 package qsort /* #include <stdlib.h> typedef int (*qsort_cmp_func_t) (const void* a, ...

  7. 初识python: 文件下载进度

    (后续待更新...) 使用 request 的 urlretrieve 方法创建"回调函数": 下载进度 详细代码如下: #!/user/bin env python # auth ...

  8. centos7 安装zabbix3.0 安装zabbix4.0 yum安装zabbix 国内源安装zabbix 阿里云服务器安装zabbix

    首先,此篇文章是有原因的. 刚开始也和大家一样来学习安装zabbix 奈何网上的教程和现实出现不一样的情况 在安装zabbix过程中,因为zabbix下载源是在国外,下载途中会出现终止下载的情况 tr ...

  9. vue中自定义属性

    <div v-bind:id="name"></div> //v-bind:id="变量" or :id="变量"

  10. ubuntu 18.04 安装mongodb并设为开机自启动

    导入包管理系统使用的公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB4 ...