题目大意:给你$n$个不重复的数,其值域为$[0,2^k)$,问你至少需要将这$n$个数拆成多少个集合,使得它们互相不是对方的子集,并输出方案。

数据范围:$n≤10^6$,$k≤20$。

$MD$我场上都想了啥。。。。

我们显然有一种$O(3^k)$的做法,对于数字$x$,我们枚举其子集,设当前枚举到的子集为$u$,我们连一条$u->x$的边,然后跑一个拓扑排序,即可确定至少需要划分为多少个集合(我场上根本没在想拓扑排序。。。。)

然后,这个显然会$TLE+MLE$。

然后我们发现,若存在$u,v,w,$满足$u$是$v$的子集,$v$是$w$的子集,那么这种情况下,从$w$连边向$u$,其实是多余的。故对于数字$x$,我们只需要连接$u->x$,其中$u$^$x=2^p$。那么边的数量就成功降低至$2^k$。

时间复杂度:$O(nk)$。

 #include<bits/stdc++.h>
#define M 1100005
using namespace std;
struct edge{int u,next;}e[M*]={}; int head[M]={},use=;
void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;}
int n,k,id[M]={};
queue<int> q; int dfn[M]={},in[M]={};
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
int x; scanf("%d",&x);
id[x]=i;
}
for(int i=;i<(<<k);i++){
for(int j=;j<k;j++)
if((i&(<<j))==) add(i,i^(<<j)),in[i^(<<j)]++;
}
q.push();
while(!q.empty()){
int u=q.front(); q.pop();
if(id[u]) dfn[u]++;
for(int i=head[u];i;i=e[i].next){
in[e[i].u]--;
dfn[e[i].u]=max(dfn[e[i].u],dfn[u]);
if(in[e[i].u]==) q.push(e[i].u);
}
}
cout<<<<endl;
cout<<dfn[(<<k)-]<<endl; for(int i=;i<=dfn[(<<k)-];i++){
int res=;
for(int j=;j<(<<k);j++) res+=(dfn[j]==i&&id[j]);
printf("%d ",res);
for(int j=;j<(<<k);j++) if(dfn[j]==i&&id[j]) printf("%d ",j);
printf("\n");
}
}

【洛谷P4934】 礼物,拓扑排序的更多相关文章

  1. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  2. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  3. 【洛谷 P4934】 礼物 (位运算+DP)

    题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...

  4. [NOIP2008] 提高组 洛谷P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  5. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

  6. 洛谷P1155 双栈排序

    这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...

  7. 洛谷P4165 [SCOI2007]组队(排序 堆)

    题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...

  8. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  9. 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)

    题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...

随机推荐

  1. 如何配置JDK?

    有很多人,java都下载好,却因不会配置JDK,而无法编程.今天巩固就来教大家配置JDK.​ 第一步:将下载好的java放在D盘(最好不要占用C盘).​​​ 第二步:右击我的电脑,选择"属性 ...

  2. 解决Docker时区与主机时区不一致的问题

    在Dockerfile里面增加以下红色的部分 FROM hub.chinacloud.com/common/jdk:8MAINTAINER xxx@chinacloud.com.cn RUN mkdi ...

  3. AlertDialog设计对话框

    MainActivity.java        public class MainActivity extends Activity {       TextView show;       Str ...

  4. 老刘 Yii2 源码学习笔记之 Action 类

    Action 的概述 InlineAction 就是内联动作,所谓的内联动作就是放到controller 里面的 actionXXX 这种 Action.customAction 就是独立动作,就是直 ...

  5. springmvc 孔浩 hibernate code

    model--User package model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; ...

  6. smarty-2014-02-28

    使用smarty,在tpl文件中如何使用相对路径调用css&javascript文件,实际上这个相对路径的参照物就是以调用该tpl文件的php文件来写. 假如,我在index.php这个文件中 ...

  7. plsql高版本无法设置Fixedsys字体解决办法(win7&winXP适用)

    http://hi.baidu.com/crsky2008/item/c174c9fb52577919e3e3bd6b 设置如下:Tools->Preferences->Oracle-&g ...

  8. 【WP8.1】页面的导航效果

    <Page.Transitions> <TransitionCollection> <NavigationThemeTransition> <CommonNa ...

  9. 【转】WPF中PasswordBox控件的Password属性的数据绑定

    英文原文:http://www.wpftutorial.net/PasswordBox.html 中文原文:http://blog.csdn.net/oyi319/article/details/65 ...

  10. 开源项目之ASP.NET Core + Vue.js 的前后端分离的通用后台管理系统框架

    年前看了这个开源项目感觉很不错,这个小项目对于传统的.net 开发人员,想做技术提升是一个很不错的参考案例. 开源项目演示地址:https://dnczeus.codedefault.com/logi ...