首页 > 其他分享 >P8317 [FOI2021] 幸运区间

P8317 [FOI2021] 幸运区间

时间:2023-11-14 15:16:01浏览次数:33  
标签:P8317 FOI2021 mid int cnt 区间 幸运

P8317 [FOI2021] 幸运区间

题目传送门

 分治 + dfs

 首先可以发现 \(k\) 和 \(d\) 很小,所以是可以搜索的。

 那么就考虑如何枚举区间,显然 \(n^2\) 枚举是会超时的,所以就考虑分治来求。

 求的过程中就分成三种情况来处理:在左边一半,在右边一半,以及跨越中间点。显而易见的是,跨越中间点的区间肯定是包含 \(mid\) 的,所以我们就可以从 \(mid\) 为起点往往左右扩展。

 然后搜索的时候每一次先尽量用之前选过的数来扩展这个区间,然后再向左边区间或者右边区间添加幸运数字去扩展。

int n, m, k;
int w[N][M];
bool flg[N];
int ansl, ansr, len;
int cnt;

void dfs(int l, int r, int L, int R) {
	// 向左右尽可能扩展区间
    while (l < L) {
		bool st = false;
		for (int i = 1; i <= m; i ++)
			st |= flg[w[L - 1][i]];
		if (st) L --; 
		else break;
	}
	while (r > R) {
		bool st = false;
		for (int i = 1; i <= m; i ++)
			st |= flg[w[R + 1][i]];
		if (st) R ++;
		else break;
	}

    // 更新答案
	if (len < R - L + 1) len = R - L + 1, ansr = R, ansl = L;
	else if (len == R - L + 1 && ansl > L) ansr = R, ansl = L;
	if (cnt == k) return ;

    // 向左右添加幸运数字去扩展
	if (l < L)
		for (int i = 1; i <= m; i ++) {
			cnt ++;
			flg[w[L - 1][i]] = true;
			dfs(l, r, L - 1, R);
			flg[w[L - 1][i]] = false;
			cnt --;
		}
	if (r > R) 
		for (int i = 1; i <= m; i ++) {
			cnt ++;
			flg[w[R + 1][i]] = true;
			dfs(l, r, L, R + 1);
			flg[w[R + 1][i]] = false;
			cnt --;
		}
}

void get(int l, int r) {
	if (l == r) return ;
	int mid = (l + r) >> 1;
	get(l, mid), get(mid + 1, r);
	cnt = 1;
	for (int i = 1; i <= m; i ++) {
		flg[w[mid][i]] = true;
		dfs(l, r, mid, mid);
		flg[w[mid][i]] = false;
	}
}

int main(){
	int T = fr();
	for (int id = 1; id <= T; id ++) {
		printf("Case #%d: ", id);
		n = fr(), m = fr(), k = fr();
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= m; j ++)
				w[i][j] = fr();
		ansl = 1, ansr = 1;
		len = 1;
		get(1, n);
		fw(ansl - 1), kg, fw(ansr - 1), ch;
	}
	return 0;
}

标签:P8317,FOI2021,mid,int,cnt,区间,幸运
From: https://www.cnblogs.com/jingyu0929/p/17831599.html

相关文章

  • 通过HTML和JavaScript实现随机抽取幸运员工
    需求描述:公司经常会要求IT部门做一个小功能给公司随机抽取员工<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><t......
  • 爆款阿里P5到P7晋升之路,九大源码文档助我超神果然努力幸运并存
    前言相信有许多的程序员,工作了这么多年;但是依然不知道自己掌握的技术栈+项目,究竟达到了阿里的什么职级,还有薪资水平是什么样的;下面就给大家分享一波对标阿里p5到P7职级所掌握的技术栈和薪资水平的路线,后续还有P8到P9的路线。P5到P7p8到p9九大源码文档经过这套学习路线的学习,让我渐......
  • P2567 [SCOI2010] 幸运数字
    题目链接题目中询问数据范围达到了1e10,且要求找符合要求数的个数,很容易让我想到数位dp,但其实每必要,发现幸运数字只有\(2^{10}\)个,答案就是近似幸运数+幸运数-两者交集,考虑容斥,每个\([l,r]\)之间的可能被之前的幸运数更新多次,通过容斥,很容易知道1个幸运数个数-2个幸运数lcm个......
  • 【2023.05.04】幸运的猫(下)
    本次博客主要写黑猫回家后的故事未到家前我打电话和我父亲开玩笑说要带女朋友回家过年我爹还蛮激动的,问是哪里的女孩子,我说是福州的忘记了带回家后他是什么心情了哈哈果然还是要多写日记啊,不然什么都忘记了可太糟糕了初到家中初到家里的时候是还关在笼子里的,因为想把猫养......
  • L1-062 幸运彩票
    题目:彩票的号码有6位数字,若一张彩票的前3位上的数之和等于后3位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。输入格式:输入在第一行中给出一个正整数N(≤ 100)。随后N行,每行给出一张彩票的6位数字。输出格式:对每张彩票,如果它是幸运的,就在一行......
  • 【2023.04.21】幸运的猫(上)
    此文用来记录我家黑猫旺来出生和黑猫的初见是在19年的9月份,那时的我暑假留校后,给自己留了两周的假期回家这个暑假我周游了整个福大,拍了可能有二三十只流浪猫吧,认识了学校的所有流浪猫但是这只黑猫反而是我返校第一次见,开学后学校人多,加上我事情比较多,因此只匆匆拍了几张照片......
  • sdutoj3009 幸运数
    幸运数TimeLimit:1000ms  Memorylimit:262144K  有疑问?点这里^_^题目描述如果,a是幸运数,b是幸运数,那么a+b+2也是幸运数。现在,告诉你两个幸运数a和b,请问c是不是幸运数。输入输入数据有多行组成,首先是一个整数N(0<N<1000),表示测试实列的个数,然后是N行数据,每行......
  • 洛谷 P3292 [SCOI2016]幸运数字
    https://www.luogu.com.cn/problem/P3292多次询问求一条链取若干点的最大异或和考虑一个集合的最大异或和可以求出线性基完成,两个集合的线性基可以合并,但是线性基并没有可减性,于是我们求lca的时候只能每次往集合里添加一条链,为了保证复杂度只能用倍增做。std::vector<i64>......
  • 蓝桥杯备战日志(Python)18-第几个幸运数字-(枚举只含某些因子的整数)
    第几个幸运数字原题到X星球旅行的游客都被发给一个整数,作为游客编号。X星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7就可以获得一......
  • 最幸运的数字
    最幸运的数字$8$是中国的幸运数字,如果一个数字的每一位都由$8$构成则该数字被称作是幸运数字。现在给定一个正整数$L$,请问至少多少个$8$连在一起组成的正整数(即最......