ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces 1581 C. Portal(前缀和)

2021-09-30 21:31:39  阅读:191  来源: 互联网

标签:int sum 1581 矩阵 Codeforces Portal cnt1 MAXN include


传送门

题意:

给出一个 n × m n \times m n×m 的 01 01 01 矩阵,一次操作可以反转某个单元格的值。求最少需要多少次操作,才能使得矩阵中存在一个子矩阵,满足矩阵中间的值都为 0 0 0,矩阵边界的值都为 1 1 1,四个顶点可以不用考虑,且子矩阵的长要 ≥ 5 \geq 5 ≥5,宽 ≥ 4 \geq 4 ≥4。

题解:

枚举左上角顶点的行,再枚举左下角顶点的行,再枚举列,那么此时就确定了一条竖线。

设 c n t 1 cnt1 cnt1该竖线为子矩阵边界所需要的操作数, c n t 2 cnt2 cnt2 为该竖线为子矩阵中间的列的操作数。

假设当前列为 k k k ,设 s u m [ i ] sum[i] sum[i]表示前 i i i列的 c n t 2 cnt2 cnt2的和。

那么如果我们以当前第 k k k列为子矩阵的右边界,那么我们就需要找一个最大的 s u m [ i ] − c n t 1 sum[i]-cnt1 sum[i]−cnt1 ,满足 s u m [ k − 1 ] − s u m [ i ] + c n t 1 sum[k-1]-sum[i]+cnt1 sum[k−1]−sum[i]+cnt1 最小,因为这样表示中间所用的操作数是最少的。

代码:

#pragma GCC diagnostic error "-std=c++11"
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int MAXN=4e2+5;
const int inf=0x3f3f3f3f;
char s[MAXN][MAXN];
int b[MAXN][MAXN],a[MAXN][MAXN];
int pre[MAXN];
void work()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n;i++){
        for (int j = 1; j <= m;j++){
            cin >> s[i][j];
            int id = s[i][j] - '0';
            a[i][j] = id;
            b[i][j] = b[i - 1][j] + id;
        }
    }
    int ans = 1e9;
    for (int i = 1; i <= n;i++){
        for (int j = i+4; j <= n;j++){
            int sum = 0;
            pre[0] = -1e9;
            for (int k = 1; k <= m;k++){
                int p1 = b[j - 1][k] - b[i][k];
                int p0 = 2 - a[j][k] - a[i][k];
                int r = j - i - 1 - p1;
                if(k>=4){
                    ans = min(ans, r + sum - pre[k - 3]);
                }
                sum += p1 + p0;
                pre[k] = max(pre[k - 1], sum - r);
            }
        }
    }
    cout << ans << endl;
}
int main()
{
    int t;
    cin >> t;
    for (int i = 1; i <= t;i++)
        work();
}

标签:int,sum,1581,矩阵,Codeforces,Portal,cnt1,MAXN,include
来源: https://blog.csdn.net/weixin_45755679/article/details/120572648

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有