1 条题解

  • 0
    @ 2025-8-24 22:44:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zhuweiqi
    攀峰之高险,岂有崖颠;搏海之明辉,何来彼岸?前进不止,奋斗不息。

    搬运于2025-08-24 22:44:41,当前版本为作者最后更新于2023-02-06 08:15:47,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    首先我们一看这个比较奇怪的数据范围,二维数组是肯定开不了的,那么我们就需要用两个一维数组来存储一下每行每列的反转情况了,由于同一行或者同一列被反转了偶数次之后等于没反转,所以我们就用 ri=1r_i=1 来表示第 ii 行被反转了,用 cj=1c_j=1 来表示第 jj 列被反转了,等 kk 次反转结束之后,我们设当前坐标为 ai,ja_{i,j}:如果 ri=0r_i=0 并且 cj=0c_j=0,就说明第 ii 行第 jj 列都没有被真正的反转,所以 ai,j=0a_{i,j}=0;同理,如果 ri=1r_i=1 并且 cj=1c_j=1,就说明第 ii 行第 jj 列都被反转了,那么 ai,ja_{i,j} 就被反转了两次,反转了偶数次之后等于没反转,所以 ai,j=0a_{i,j}=0;另外,如果第 ii 行和第 jj 列中有且只有一个被反转了,那么 ai,ja_{i,j} 就被反转了一次,所以 ai,j=1a_{i,j}=1,最终得出结论:如果 ricjr_i \neq c_jai,j=1a_{i,j}=1,我们只需要一个双重循环判断就可以了,上代码!

    #include<bits/stdc++.h>
    using namespace std;
    int r[5000005],c[5000005];
    int main(){
    	std::ios::sync_with_stdio(0);
    	int n,m,k,ans=0;
    	cin>>n>>m>>k;
    	for(int i=1;i<=k;i++){
    		char d;int x;
    		cin>>d>>x;
    		if(d=='R') r[x]=!r[x];
    		else c[x]=!c[x];
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(r[i]!=c[j]) ans++;
    		}
    	}
    	cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    8168
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者