Advertisement

上海计算机学会2024年12月月赛C++乙组T2删除网格

阅读量:

删除网格

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定 n×m 的矩阵 a,对 1≤x≤n,1≤y≤m 的 x,y 定义 w(x,y)为:

换句话说,在每一行和每一列之外的位置上取ai,j与ax,y进行异或运算后再相加得到w(x,y)。这里使用的是按位异或运算符。

求 w(x,y) 的最大 值。

输入格式

第一行两个整数 n,m。

接下来 n 行,第 i 行 m 个整数 ai,1∼m​ 表示矩阵第 i 行的元素。

输出格式

一行一个整数表示答案。

数据范围

对于 30% 的数据,1≤n,m≤10,0≤ai,j​≤1。

对于 60% 的数据,1≤n,m≤105,1≤n×m≤106,0≤ai,j​≤1。

对于 100% 的数据,1≤n,m≤105,1≤n×m≤106,0≤ai,j​<2^30。

样例数据

输入:
2 3
1 2 3
4 5 6
输出:
13
说明:
选择 (x,y)=(2,1),则 w(x,y)=(4 xor 2)+(4 xor 3)=6+7=13。

解析:

详见代码:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int n, m;
    
 vector <int> a[100005];//a[i][j]表示矩阵第i行第j列的数字
    
 int r[100005][2][35];//r[i][j][k]表示第i行二进制第k位数字是j的数量
    
 int c[100005][2][35];//c[i][j][k]表示第i列二进制第k位数字是j的数量
    
 int sum[2][35];//sum[i][j]表示矩阵中二进制第j位为i的数字数量
    
 long long ans = 0;//答案
    
 int main() {
    
     cin >> n >> m;
    
     for(int i = 0; i < n; i++) {//循环输入矩阵
    
     for(int j = 0; j < m; j++) {
    
         int x;
    
         cin >> x;
    
         a[i].push_back(x);
    
         for(int k = 0; k < 30; k++) {//循环取第k位(从低位开始)
    
             if (x % 2 == 0) {//统计行,列,整体中0和1的数量
    
                 r[i][0][k]++;
    
                 c[j][0][k]++;
    
                 sum[0][k]++;
    
             } else {
    
                 r[i][1][k]++;
    
                 c[j][1][k]++;
    
                 sum[1][k]++;
    
             }
    
             x /= 2;
    
         }
    
     }
    
     }
    
     for(int i = 0; i < n; i++) {//枚举删除a[i][j]后的结果
    
     for(int j = 0; j < m; j++) {
    
         long long t = 0;
    
         long long w = 1;//位权
    
         int x = a[i][j];
    
         for(int k = 0; k < 30; k++) {//枚举每一位
    
             if (x % 2 == 0) {
    
                 t += (sum[1][k] - r[i][1][k] - c[j][1][k]) * w;
    
             } else {
    
                 t += (sum[0][k] - r[i][0][k] - c[j][0][k]) * w;
    
             }
    
             x /= 2;
    
             w *= 2;
    
         }
    
         ans = max(ans, t);//取最大值
    
     }
    
     }
    
     cout << ans;
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~