首页 > 其他分享 >【luogu ARC106E】Medals(二分)(高维前缀和)

【luogu ARC106E】Medals(二分)(高维前缀和)

时间:2022-10-24 22:46:00浏览次数:94  
标签:二分 第三层 luogu 2aik mid ARC106E include Medals

Medals

题目链接:luogu ARC106E

题目大意

有 n 个第 i 个人的出现规律是对于所有 2aik+1~2ai(k+1) 的区间,2aik+1~2aik+ai 会出现,另一部分则会不见。
每个时间点你可以选择一个出现的人奖励他,要你每个人都奖励 k 次,问你最少要用的时间。

思路

首先考虑二分,然后发现每个时间要跟每个人匹配,那先试着建立网络流模型。
然后考虑一下加速过程。

第二层是人,第三层是每一天。

然后最大匹配等于最小割。
发现割第二层边一定不优,考虑一三层边分别割一些。
考虑第一层边是人的,很少只有 \(18\),可以直接状压每条边要不要割掉,然后考虑求对应的第三层边要割哪些。
那就是剩下的点里面能走到的第三层点的交集。

然后这样不好记录考虑对于每个第三层的点求出哪些可以到它,也是状压记录。
这里我们求不可以到它。
那它以及它的子集都是不可以到的,那如果出现下面删这样的情况,我们就需要把这条边删掉。
那上面的那个子集类似搞一个高维前缀和,就能预处理出数组了。

然后至于二分的判断就是你要看是否会有一种人割的情况使得无法完全匹配。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 20;
int n, k, a[N], S[4000005], f[1 << 18];
int cntnum[1 << 18];

bool check(int m) {
	memset(f, 0, sizeof(f));
	for (int i = 1; i <= m; i++) f[S[i]]++;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < (1 << n); j++)
			if (!((j >> i) & 1)) f[j] += f[j | (1 << i)];
	}
	for (int i = 1; i < (1 << n); i++) {
		if (m - f[i] + (n - cntnum[i]) * k < n * k) return 0;
	}
	return 1;
}

int main() {
	for (int i = 1; i < (1 << 18); i++)
		cntnum[i] = cntnum[i - (i & (-i))] + 1;
	
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		for (int j = 0; j <= 2 * n * k; j += 2 * a[i]) {
			for (int k = 1; k <= a[i]; k++) S[j + k] |= (1 << (i - 1));
		}
	}
	for (int i = 0; i <= 2 * n * k; i++) S[i] ^= (1 << n) - 1;
	
	int L = n * k, R = n * k * 2, ans = R + 1;
	while (L <= R) {
		int mid = (L + R) >> 1;
		if (check(mid)) ans = mid, R = mid - 1;
			else L = mid + 1;
	}
	printf("%d", ans);
	
	return 0;
}

标签:二分,第三层,luogu,2aik,mid,ARC106E,include,Medals
From: https://www.cnblogs.com/Sakura-TJH/p/luogu_ARC106E.html

相关文章

  • 【luogu AGC035E】Develop(分类讨论)(DP)
    Develop题目链接:luoguAGC035E题目大意一开始有-1e18~1e18的所有整数,然后你每次操作可以在1~N中选一个还在的数x,擦掉他,然后查看x-2,x+K,如果没有就把数加上。然后......
  • luogu P8275 [USACO22OPEN] 262144 Revisited P
    题面传送门这里有个sb写这道题写了一下午。首先来考虑一段子段上的答案,显然答案有一个区间,设最大值为\(E\),则最小值一定在\([E,E+\logn]\)之间。我们考虑按照最大值分......
  • luogu P8585 球状精灵的传说 题解
    题目大意给定\(n\)个精灵的三维幅度\(\{r_{1,i},r_{2,i},r_{3,i}\}\),任意两个精灵若在三个幅度中有两个相同(这里可以乱序)则可以将剩下的一位相加组合起来。组合过的精......
  • Luogu P8348
    构造题。……这玩意儿怎么构造。不过只用判断Yes/No。考虑找一个方法唯一的表示一对数能表示的拓展出的序列包含的所有“一对数”。容易想到一直减到最小,用最终结果......
  • [luogu6575]Friends
    记$s=p+q$,当存在一个点度数$\ges$时,显然无解记$d_{S,T}=\sum_{x\inS,y\inT}[(x,y)\inE]$,称$S\subseteqV$合法当且仅当$|S|\lep$且$d(S,V\backslashS)\leq$结论:若......
  • Luogu P2656采蘑菇(Tarjan + spfa)
    采蘑菇题目描述小胖和ZYR要去ESQMS森林采蘑菇。ESQMS森林间有\(N\)个小树丛,\(M\)条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇。小胖和ZYR......
  • 【luogu AGC034F】RNG and XOR(FWT)
    RNGandXOR题目链接:luoguAGC034F题目大意给你一个长度为2^n的数组A。一开始有一个\(0\)数,然后每次你随机给它异或上0~2^n-1中的数,随机到\(i\)的概率跟Ai+1......
  • luogu P1972 SDOI2009 HH的项链
    P1972SDOI2009HH的项链-洛谷|计算机科学教育新生态(luogu.com.cn)维护一个长度同为\(n\)的数组\(b\)。一个指针\(R\)从\(1\)扫到\(n\)并做如下操作:检查......
  • 【luogu CF1163F】Indecisive Taxi Fee(图论)(分类讨论)
    IndecisiveTaxiFee题目链接:luoguCF1163F题目大意给你一个无向图,每次改一条边的权值(每次都会变回来),问你1~n的最短路长度。思路考虑分类讨论,先找到最短路的路径,然......
  • 【luogu CF1140F】Extending Set of Points(线段树分治)
    ExtendingSetofPoints题目链接:luoguCF1140F题目大意有一个点集,有一个扩展操作是加入符合条件的(x0,y0)直到不能加入位置。符合条件是原来(x0,y0)不存在而且存......