ACM-ICPC 2018 南京赛区网络预赛

本文介绍了一种高效算法,用于计算给定矩阵中不包含黑色子矩阵的数量。通过分析矩阵特性,利用双层循环进行计算,并通过加入特定条件减少计算量,最终实现了O(n*m*m)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                          B.The writing on the wall

题目链接:https://nanti.jisuanke.com/t/30991

题意:给你一个n*m得矩阵,中间有些是黑色,问你里面有多少个没有黑色矩阵得子矩阵

思路:对于一个长为L, 高为H的无黑点矩阵中包含的高为H的子矩阵个数为L+(L-1)+(L-2)+...+1个;这是直接算的一种方法;如何程序表示该计算呢?其中h是固定值

for(int i=1; i<=L; i++){
    for(int j=i; j>0; j--){
        cnt+=h;
    }
}

这样的一个双层循环就表示了上式;那么所有子矩阵个数就是三层循环,高由1->H:

for(int h=1; h<=H; h++){
    for(int i=1; i<=L; i++){
        for(int j=i; j>0; j--){
            cnt+=h;
        }
    }
}

这是其中没有黑点的;如果在某处加了个黑点又如何计算呢?

我们固定一个右下得点让他往上往左看,如果当前小是不是再往右就更小了呢?

for(int i=1; i<=H; i++){
    for(int j=1; j<=L; j++){
        h=i;
        for(int k=j; k>0; k--){
            h=min(h, i-p[k]);
            cnt+=h;
        }
    }
}
//p[k]表示第k列中在i行上边的第一个黑点的位置,

那么我们现在用n代替H,m代替L这样就是一个复杂度为O(n*m*m)得算法,看题后我们应该吧100当作m另一个当作n这样就时间刚好,我们用标记黑点得位置去维护h即可

附上AC代码

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

int a[100010][110],up[110];

int main()
{
    int T,cas=1;
    scanf("%d",&T);
    int n,m,k,x,y;
    ll minn;
    while(T--){
        scanf("%d%d%d",&n,&m,&k);
        memset(a,0,sizeof a);
        memset(up,0,sizeof up);
        for(int i=0;i<k;i++){
            scanf("%d%d",&x,&y);
            a[x][y]=1;
        }
        ll ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
                if(a[i][j])up[j]=i;
            for(int j=1;j<=m;j++){
                minn=0x7f7f7f7f7f7f7f7f;
                for(int k=j;k>0;k--){
                    minn=min(minn,(ll)(i-up[k]));
                    ans+=minn;
                }
            }
        }
        printf("Case #%d: %lld\n",cas++,ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值