C++ 代码优化:方格涂色问题
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);
}
代码解释
-
变量声明
heng和shu数组分别记录每一行和每一列的涂色次数。hengN和shuN变量分别记录被涂色的行和列的数量。vHeng和vShu数组分别存储被涂色的行和列的具体位置。specialA用于判断所有操作是否为 1,如果有一个操作不是 1,则该变量为 false。
-
输入和操作
- 使用
scanf函数读取输入数据。 - 根据
op的值来判断操作类型,更新相应的数组。 - 如果操作类型为 1,则更新
heng数组,否则更新shu数组。 - 如果涂色次数达到 k,则擦除该方格的涂色,并将相应的计数器和位置数组进行更新。
- 使用
-
计算最终被涂色的方格数
- 初始化
ans为hengN * m + shuN * n,表示每一行和每一列都被涂色了一次。 - 遍历
vHeng和vShu数组,对于每一个被涂色的行和列,判断是否涂色次数为 k,如果是则将ans减去m或n。
- 初始化
优化建议
- 使用
std::vector存储被涂色的行和列,这样可以动态调整数组大小,避免出现内存溢出的问题。 - 可以使用更清晰的变量名称,例如
rowCounts和colCounts来代替heng和shu。 - 可以使用
std::map或std::unordered_map存储每一行和每一列的涂色次数,这样可以更方便地进行查找和更新操作。 - 可以使用
std::accumulate函数计算最终被涂色的方格数量,这样可以简化代码。
总结
本文提供了一个 C++ 代码示例,用于解决方格涂色问题。代码经过优化,更易于理解和维护。您可以参考代码示例和优化建议,编写更高效的代码。
原文地址: https://www.cveoy.top/t/topic/qvq4 著作权归作者所有。请勿转载和采集!