[luoguP3694] 邦邦的大合唱站队/签到题(状压DP)

传送门

来自kkk的题解:

70分做法:枚举每个学校顺序,暴力。

100分:状压dp。从队列头到尾DP,

状态:f[i]表示i状态下最小的出列(不一致)的个数。

比如f[1101]表示从头到位为1/3/4乐队的偶像的最小出列个数。

f[i]=min(f[i\ xor\ 2^j]+num[j]-(sum[length][j]-sum[length-num[j]][j]));f[i]=min(f[i xor 2?j??]+num[j]−(sum[length][j]−sum[length−num[j]][j]));

j表示团队编号,sum表示某种团队的前缀和,length表示到此已经排到的长度。

#include <cstdio>
#include <cstring>
#include <iostream>
#define M 21
#define N 100001
#define min(x, y) ((x) < (y) ? (x) : (y))

int n, m, S, cnt;
int sum[N][M], num[M], f[1 << M];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

int main()
{
	int i, j, x;
	n = read();
	m = read();
	memset(f, 127, sizeof(f));
	for(i = 1; i <= n; i++)
	{
		x = read();
		num[x]++;
		for(j = 1; j <= m; j++)
			sum[i][j] = sum[i - 1][j] + (x == j);
	}
	f[0] = 0;
	for(i = 1; i < (1 << m); i++)
	{
		S = 0;
		for(j = 1; j <= m; j++)
			if(i & (1 << j - 1))
				S += num[j];
		for(j = 1; j <= m; j++)
			if(i & (1 << j - 1))
			{
				cnt = num[j] - sum[S][j] + sum[S - num[j]][j];
				f[i] = min(f[i], f[i ^ (1 << j - 1)] + cnt);
			}
	}
	printf("%d\n", f[(1 << m) - 1]);
	return 0;
}

  

时间: 2024-10-28 23:08:23

[luoguP3694] 邦邦的大合唱站队/签到题(状压DP)的相关文章

P3694 邦邦的大合唱站队/签到题(状压dp)

P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起.重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意. 请问最少让多少偶像出列? 输入输出格式 输入格式: 第一行2个整数N,M. 接下来N个行,每行一个整数a_i(1\le a_i

【思维题 状压dp】APC001F - XOR Tree

可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree with N vertices. The vertices are numbered 0 through N−1, and the edges are numbered 1 through N−1. Edge i connects Vertex xi and yi, and has a value ai.

Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925

题目传送门 最开始学状压的时候...学长就讲的是这个题.当时对于刚好像明白互不侵犯和炮兵阵地的我来说好像在听天书.......因为我当时心里想,这又不是什么棋盘,咋状压啊?!后来发现这样的状压多了去了hhh.后来这道题就一直压着了,现在对状压明白了一点便来填坑. 我们注意到,团体队员数$N$比较大,而团体数$M$很小(不能称为乐队).那么我们可以在$m$上下功夫,把它压成二进制串.开始想的状态是0表示这个团体还没站好,1表示这个团体已经站好了.看了看jtdalao的文章发现自己的状态是对的,但是

QDUOJ 来自xjy的签到题(bfs+状压dp)

来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1分钟可以移动到非'#'的相邻格子(与当前所在格子具有公共边).花园下面有m个隧道,每个隧道有一个出口和一个入口.当爱丽丝到达隧道的入口时,她可以选择(也可以不选择)进入隧道入口,并通过隧道一次,然后立即(不花费时间)出现在隧道出口.爱丽丝一开始可以降临在花园的任何地方.有好奇心的爱丽丝想知道,她通过所有

POJ 2411 &amp;&amp; HDU 1400 Mondriaan&#39;s Dream (状压dp 经典题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12341   Accepted: 7204 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

刷题总结——bzoj1725(状压dp)

题目: 题目描述 Farmer John 新买了一块长方形的牧场,这块牧场被划分成 N 行 M 列(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地. FJ 打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫瘠,不能用来放牧.并且,奶牛们喜欢独占一块草地的感觉,于是 FJ 不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边.当然,FJ 还没有决定在哪些土地上种草. 作为一个好奇的农场主,FJ 想知道,如果不考虑草地的总块数,

刷题向》关于第一篇状压DP BZOJ1087 (EASY+)

这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合法的判断条件就出来了:就是对于情况X,如果X&(x<<1)==0,即为合法情况. 同理这样我们就可以得出每一行对于上一行是否合法的条件:(x&y)==0&&(x&(y<<1))==0&&(x&(y>>1))==

Orz_panda cup I题 (xdoj1117) 状压dp

Orz_panda cup I题 (xdoj1117)  状压dp 1117: Insert Orz Pandas 时间限制: 2 Sec  内存限制: 128 MB提交: 15  解决: 5[提交][状态][讨论版] 题目描述 Orz panda emotion is a famous emotion in XDU/ACM-ICPC QQ groups.Big Big Xi loves to create new Orz panda emotions.Now he has a matrix w

【BZOJ-3195】奇怪的道路 状压DP (好题!)

3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 305  Solved: 184[Submit][Status][Discuss] Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往.一对城市之间可能存在

【专业找水题】状压dp最水题,没有之一

题目链接 现在代码能力没上升,倒是越来越会找水题了(比例题还水的裸题你值得拥有) 这网站不是针对竞赛的,所以时空限制都很宽松 然后就让我水过去了 对于每个点,包括自己的前m个元素是否取都是一种状态,所以状压一下(才1024不要怂) 1 #include <cstdio> 2 int n,m,q; 3 int a[1001]; 4 int dp[1001][2000]; 5 int max(int a,int b){return(a<b)?b:a;} 6 int main() 7 { 8