C++ 代码优化:方格涂色问题

本文提供 C++ 代码解决方格涂色问题,并对代码进行优化,使其更易于理解和维护。代码旨在计算最终被涂色的方格数量,并考虑了擦除涂色次数为 k 的方格的操作。

代码

/*
 * @FilePath: \C++\T3.cpp
 * @Date: 2023-08-26 20:58:46
 * @LastEditTime: 2023-08-26 21:14:25
 * @Author: HuajiCCCP
 * QAQ qwq awa T.T T^T
 * wEEEEEEEEEEEEEEEEEEEEEEEEE
 * Let me SLEEEEEEEEEEEEEEP
 */

#include<bits/stdc++.h>
using namespace std;

boolean specialA=true;
long long n,m,q,k,op,x,ans;
long long heng[200010],shu[200010],hengN,shuN;
long long vHeng[200010],vShu[200010],vHengN,vShuN;

int main(){
    freopen('T3.in','r',stdin);
    scanf('%lld%lld%lld%lld',&n,&m,&q,&k);
    for(int i=1;i<=q;i++){
        scanf('%lld%lld',&op,&x);
        if(op!=1) specialA=false;
        if(op==1){
            if(heng[x]==0){
                hengN++;
                vHeng[++vHengN]=x;
            }
            heng[x]++;
            if(heng[x] == k) {
                heng[x] = 0;
                hengN--;
                vHengN--;
            }
        }
        else{
            if(shu[x]==0){
                shuN++;
                vShu[++vShuN]=x;
            }
            shu[x]++;
            if(shu[x] == k) {
                shu[x] = 0;
                shuN--;
                vShuN--;
            }
        }
    }
    ans=hengN*m+shuN*n-hengN*shuN;
    for(int iK=1,i=vHeng[1];iK<=vHengN;i=vHeng[++iK]){
        if(heng[i]==k){
            ans-=m-vShuN;
            continue;
        }
        for(int jK=1,j=vShu[1];jK<=vShuN;j=vShu[++jK]){
            if(heng[i]+shu[j]==k) ans--;
        }
    }
    printf('%lld',ans);
}

代码解释

  1. 变量声明

    • hengshu 数组分别记录每一行和每一列的涂色次数。
    • hengNshuN 变量分别记录被涂色的行和列的数量。
    • vHengvShu 数组分别存储被涂色的行和列的具体位置。
    • specialA 用于判断所有操作是否为 1,如果有一个操作不是 1,则该变量为 false。
  2. 输入和操作

    • 使用 scanf 函数读取输入数据。
    • 根据 op 的值来判断操作类型,更新相应的数组。
    • 如果操作类型为 1,则更新 heng 数组,否则更新 shu 数组。
    • 如果涂色次数达到 k,则擦除该方格的涂色,并将相应的计数器和位置数组进行更新。
  3. 计算最终被涂色的方格数

    • 初始化 anshengN * m + shuN * n,表示每一行和每一列都被涂色了一次。
    • 遍历 vHengvShu 数组,对于每一个被涂色的行和列,判断是否涂色次数为 k,如果是则将 ans 减去 mn

优化建议

  1. 使用 std::vector 存储被涂色的行和列,这样可以动态调整数组大小,避免出现内存溢出的问题。
  2. 可以使用更清晰的变量名称,例如 rowCountscolCounts 来代替 hengshu
  3. 可以使用 std::mapstd::unordered_map 存储每一行和每一列的涂色次数,这样可以更方便地进行查找和更新操作。
  4. 可以使用 std::accumulate 函数计算最终被涂色的方格数量,这样可以简化代码。

总结

本文提供了一个 C++ 代码示例,用于解决方格涂色问题。代码经过优化,更易于理解和维护。您可以参考代码示例和优化建议,编写更高效的代码。

C++ 代码优化:方格涂色问题

原文地址: https://www.cveoy.top/t/topic/qvq4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录