归纳所猜半结论推出完整结论:CF1592F1

https://www.luogu.com.cn/problem/CF1592F1

场上猜了个结论,感觉只会操作1。然后被样例1hack了。然后就猜如果 ( n , m ) (n,m) (n,m) 为1则翻转4操作,被#14hack了。然后就猜4操作只会进行一次,然后就不知道怎么做下去了。


上面猜的结论都正确,但是既然猜结论了,为什么不考虑先证明一波?

考虑2次操作4,代价为6,只有两种情况:

而他们都可以用操作1表示出来。

然后考虑怎么做。其实感觉没有操作4时,每个位置是否翻转都可以直接O(1)算出来。但这存在一定难度。

我当时写的是:

这样子存在逻辑联系,不方便直接表示,所以应该考虑把if取得。

怎么去?就多列几个表示出来。(相当于多一个媒介)

v i , j = a i , j ⊗ s i − 1 , j ⊗ s i , j − 1 ⊗ s i − 1 , j − 1 p i , j = v i , j ⊗ s i − 1 , j ⊗ s i , j − 1 ⊗ s i − 1 , j − 1 v_{i,j}=a_{i,j}\otimes s_{i-1,j}\otimes s_{i,j-1}\otimes s_{i-1,j-1}\\p_{i,j} = v_{i,j}\otimes s_{i-1,j}\otimes s_{i,j-1}\otimes s_{i-1,j-1} vi,j=ai,j⊗si−1,j⊗si,j−1⊗si−1,j−1pi,j=vi,j⊗si−1,j⊗si,j−1⊗si−1,j−1

然后我们发现了 s s s 和 a a a 相同。

然后发现翻转4只会改变4个位置。

然后操作4有贡献只当这4个位置同时改变。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//#define M
//#define mo
#define N 510
int n, m, i, j, k, T;
int a[N][N], p[N][N], ans; 
char str[N]; 

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}
	auto calc = [&] (int x, int y) -> int {
		return a[x][y]^a[x+1][y]^a[x][y+1]^a[x+1][y+1]; 
	}; 
	n=read(); m=read(); 
	for(i=1; i<=n; ++i) {
		scanf("%s", str+1); 
		for(j=1; j<=m; ++j) 
			if(str[j]=='B') a[i][j]=1; 
	}
	for(i=n; i>=1; --i) 	
		for(j=m; j>=1; --j) {
			p[i][j]=(p[i+1][j]^p[i][j+1]^p[i+1][j+1]); 
			if(a[i][j]^p[i][j]) p[i][j]^=1, ++ans; 
			ans+=calc(i, j); 
			if(i!=n && j!=m && calc(i, j) && calc(i, m) && calc(n, j) && calc(n, m)) k=-1; 
		}

	printf("%d", ans+k); 
	return 0;
}
相关推荐
CUC-MenG25 天前
2025牛客多校第十场 K.神奇集合 F.老师和Yuuka逛商场 E.老师与好感度 I.矩阵 个人题解
数学·线段树·贪心·dp·线性dp·构造·强联通分量·树上背包·线段树二分
程序猿编码1 个月前
二进制签名查找器(Aho-Corasick 自动机):设计思路与实现原理(C/C++代码实现)
c语言·c++·网络安全·二进制·逆向工程·ac自动机
Q741_1471 个月前
优选算法 力扣 611. 有效三角形的个数 双指针降低时间复杂度 贪心策略 C++题解 每日一题
c++·算法·leetcode·贪心·双指针
Alfred king1 个月前
面试150 IPO
面试·职场和发展·贪心·数组··排序
christ_lrs2 个月前
2025.7.25 测试 总结
贪心·模拟
yi.Ist2 个月前
关于二进制的规律
算法·二进制·bitset
christ_lrs2 个月前
2025.7.22 测试 总结
贪心·dp
工一木子3 个月前
二进制与生活:从数字世界到人生哲理
二进制
阳洞洞3 个月前
376. Wiggle Subsequence
leetcode·贪心
让我们一起加油好吗3 个月前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算