Codeforces 1051D Bicolorings
题目不是很难,有多种方法可解,但当时真正难到我的是我不知道怎么存储这个图。
1≤n,m≤5x104, n x m≤4x105 的数据量让我不知道怎么开数组,直接二维数组内存会超,然后我又想用string,也非常麻烦。
之后在cy大佬的指示下,在main中直接开变长数组,4x105的数量级不会炸栈。
此外,防止出现更大的数量级,可以用malloc在堆中动态申请内存。
或者申请一个一维数组当二维使用
再或者,用vector,这也是比较推荐的
char (*mp)[m] = ( char (*)[m] ) malloc(sizeof(char)*(n+5)*(m+5));
free(mp);
//或者 一维当二维用
char mp[8e5+10];
mp[i*m + j]// == mp[i][j]
// n x m数组 vetor
vector< vector<int> >mp;
init(){
mp.clear();
mp.resize(n+5);
for(int i=0; i<n+5; i++){
mp[i].clear();
mp[i].resize(m+5);
}
} //然后就可以正常使用mp[i][j]
关于解题部分,因为总点数较少,可以标记每行、列的标记的数量,然后暴力跑循环枚举每个点。
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
int r[50005],c[50005];
int main()
{
int N;
scanf("%d",&N);
for(int I=1; I<=N; I++){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
r[i] = 0;
for(int j=1; j<=m; j++)
c[j] = 0;
//char (*mp)[m] = (char(*)[m]) malloc(sizeof(char)*(n+1)*(m+1));
char mp[n+1][m+5];
for(int i=1; i<=n; i++){
scanf("%s",mp[i]+1);
}
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(mp[i][j]=='*'){
r[i]++;
c[j]++;
}
}
}
int an = -1;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(mp[i][j]=='.')
an = max(an, r[i]+c[j]);
else
an = max(an, r[i]+c[j]-1);
}
}
printf("%d\n",m+n-1-an);
//free(mp);
}
}