首页 > 其他分享 >[CF2057G] Secret Message 题解

[CF2057G] Secret Message 题解

时间:2025-01-15 20:54:37浏览次数:1  
标签:方案 CF2057G int 题解 pos filename ny Secret define

神秘题目。

题目的条件十分神奇,\(|A| \le \frac{1}{5} (s+p)\),不知所云。
一开始尝试用皮克定理转化,但是 failed。
阅读理解之后发现有一个(很典)的套路,就是构造出五组方案,使得 \(\sum_{cyc} |A| = s+p\),这样就一定有一组方案,面积小于等于 $ \frac{1}{5} (s+p)$。

如何构造?
我们发现一个格子可以【控制】周围四个,带上自己五个格子。差不多这样:

发现如果按照 \((2i+j) \mod 5\) 的余数来分类的话,总共五种方案,刚好每一种余数可以【密铺】整个地图。显然,这样覆盖,五种方案个数和是 \(s\)。
同时,对于边界上的没有覆盖到的,我们直接花一个方格放上去。可以证明(懒),这样带来的额外代价之和就是 \(p\)。(感性理解就是只有边界上的格子会额外贡献,且有几条边【孤立】就会额外贡献几遍)

于是我们构造出来这五种方案,取个最小值就是一组可行的解。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define all(v) v.begin(), v.end()
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)
#define multi_cases 1

namespace Traveller {
	const int N = 2e6+2;
	const int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
	
	int n, m;
	int pos(int i, int j) { return (i-1) * m + j; }
	char g[N];
	
	bool mark[N];
	char ans[5][N];
	
	void main() {
		cin >> n >> m;
		for(int i = 1; i <= n; ++i) 
			for(int j = 1; j <= m; ++j) cin >> g[pos(i, j)];
		
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j) 
				for(int k = 0; k < 5; ++k) ans[k][pos(i, j)] = 0;
		
		int mn = inf, p = 0;
		for(int k = 0; k < 5; ++k) {
			int cnt = 0;
			for(int i = 1; i <= n; ++i)
				for(int j = 1; j <= m; ++j) mark[pos(i, j)] = 0;
			for(int i = 1; i <= n; ++i)
				for(int j = 1; j <= m; ++j)
					if(g[pos(i, j)] == '#' && (2*i + j) % 5 == k) {
						mark[pos(i, j)] = 1;
						++cnt, ans[k][pos(i, j)] = 'S';
						for(int d = 0; d < 4; ++d) {
							int nx = i + dir[d][0], ny = j + dir[d][1];
							if(nx < 1 || nx > n || ny < 1 || ny > m || g[pos(nx, ny)] == '.') continue;
							mark[pos(nx, ny)] = 1; 
						}
					}
			for(int i = 1; i <= n; ++i)
				for(int j = 1; j <= m; ++j) 
					if(g[pos(i, j)] == '#' && !mark[pos(i, j)]) {
						++cnt, ans[k][pos(i, j)] = 'S';
						mark[pos(i, j)] = 1;
					}
			if(cnt < mn) mn = cnt, p = k;
		}
		
		for(int i = 1; i <= n; ++i, puts(""))
			for(int j = 1; j <= m; ++j)
				if(ans[p][pos(i, j)] == 'S') cout << 'S';
				else cout << g[pos(i, j)];
	}
}

signed main() {
#ifdef filename
	FileOperations();
#endif
	
	signed _ = 1;
#ifdef multi_cases
	scanf("%d", &_);
#endif
	while(_--) Traveller::main();
	return 0;
}


标签:方案,CF2057G,int,题解,pos,filename,ny,Secret,define
From: https://www.cnblogs.com/wfc284/p/18673694

相关文章

  • AcWing 274. 移动服务 题解
    Tag:线性dp题面link题目描述一个公司有三个移动服务员,最初分别在位置\(1,2,3\)处。如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。从\(p\)到\(q\)移动一个员工,需要花费......
  • 第七届传智杯初赛第二场(abc三组)补题+题解python
    文章目录前言A计算商品打折结算金额(B组、C组)B茶杯和球(A组、C组)C游游的字母串(A组、B组、C组)D电梯(B组、C组)E小欧的排列计算(A组、B组、C组)F游游的字母子串(A组、B组、C组)G跳跳跳(A组、B组)H小红的战争棋盘(A组)前言在CSDN上并未找到第七届传智杯......
  • 信号与系统(郑君里)第一章-绪论 1-1 课后习题解答
    题目详情(1-1分别判断题图1-1所示各波形是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?)答案解析:(a)连续信号模拟信号(b)连续信号量化信号(c)离散信号数字信号(d)离散信号抽样信号(非数字信号)(e)离散信号数字信号(f)离散信号数字信号tips:本道题目考察了连续/......
  • ABC 243题解
    ABC243A-C太水不写了。D题意:从完全二叉树上点\(X\)开始移动,每次移动至父节点、左子节点或右子节点。询问N次移动后所处节点,保证答案小于\(10^{18}\)。解法:忘了过程有可能超longlong浪费两分钟。总之就是每一个向父节点操作会消掉最近一个未消掉的向儿子移动操作,然后......
  • {LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 题解
    \(\text{LOJ\#6041.「雅礼集训2017Day7」事情的相似度题解}\)解法一由parent树的性质得到,前缀\(s_i,s_j\)的最长公共后缀实质上就是\(i,j\)在SAM中的\(\operatorname{LCA}\)在SAM中的\(\operatorname{len}\)。让我们考虑如何处理\((l,r)\)区间内的询问。直......
  • Codeforces Round 992 (Div. 2) C题解析
    CodeforcesRound992(Div.2) C题解析题目描述......
  • P4770 [NOI2018] 你的名字 题解
    \(\text{P4770[NOI2018]你的名字题解}\)注意到\(l=1,r=|S|\)有整整68分的高分,让我们先来考虑这样的特殊情况。这样的特殊情形实际上要我们求的是\(t\)有多少个本质不同的子串满足其不是\(s\)的子串。正着做看上去有些困难,于是维护\(s,t\)的本质不同公共子串个数,用......
  • 嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)
     如图,代码分区代码区域作用Privateincludes引入所需头文件,提供函数声明、类型定义和宏等Privatetypedef创建自定义数据类型,增强代码可读性与维护性Privatedefine定义常量和宏,方便代码修改与简化Privatemacro实现简单代码替换,简化代码逻辑Privatevariables声明和初始化......
  • 题解:AT_abc136_f [ABC136F] Enclosed Points
    传送门Solution对于一个点\(i\),我们将其与其它点匹配,故有\(2^{n-1}\)的方案数,这是答案的初始。对于每个点\((x_i,y_i)\)再建系,四个象限都可能会有点,我们此时考虑四个象限的点如何匹配,才能使\((x_i,y_i)\)包含其中,稍微手玩一下就可以发现,对于一四象限、二三象限的点匹......
  • 记录在虚拟机中达梦数据库DEM安装过程遇到的问题解决方法
    本篇博客是记录了在寒假课程设计中在虚拟机麒麟银河系统安装达梦数据库DEM遇到的各种刁钻问题的解决方法,希望同样遇到这些问题的小伙伴们能够在查看本篇博客后真正解决问题。废话不多说,直接往下看吧! dem服务器的安装与部署1、上传dem和tomcat压缩包2、./dminitpath=/d......