归纳所猜半结论推出完整结论: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;
}
相关推荐
Aurora_th10 天前
LeetCode 2332.坐上公交的最晚时间 (双指针 + 贪心)
c++·算法·leetcode·职场和发展·贪心·双指针
ShuQiHere19 天前
【ShuQiHere】 进制转换的世界:从十进制到二进制、十六进制的转换技巧
二进制·计算机组成
Jay 1725 天前
第四届“长城杯”网络安全大赛 暨京津冀网络安全技能竞赛(初赛) 全方向 题解WriteUp
安全·web安全·密码学·二进制·ctf·长城杯·安全杂项
SkyMaths1 个月前
AGC007F 题解
贪心·性质·好题·后效性
小妖剑1 个月前
位运算:带带孩子吧,孩子很强的!
c++·性能优化·二进制·位运算·cpp
UestcXiye1 个月前
Leetcode3256. 放三个车的价值之和最大 I
c++·leetcode·贪心·数据结构与算法
无 双1 个月前
BUUCTF PWN wp--jarvisoj_level0
网络安全·二进制·ctf pwn
00圈圈1 个月前
二进制、十进制转换进阶--小数点后的转换
算法·二进制·十进制·小数点转换
DieSnowK1 个月前
[Algorithm][贪心][跳跃游戏][加油站][单调递增的数字][坏了的计算器]详细讲解
贪心·单调递增的数字·新手向·跳跃游戏·algorithm·加油站·坏了的计算器
Tisfy1 个月前
LeetCode 3133.数组最后一个元素的最小值:位运算+双指针
算法·leetcode·二进制·题解·位运算·双指针