P1950长方形题解
P1950\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P1950} }{{\color{Red}\Large Solution} }\mathbf{} {No.2} \end{Bmatrix}\times{}\) NeeDna
首先说这个算法类似暴力 最坏复杂度 \(O(n\times m^2)\) 但是这个写法能过 而且代码简单 所以我将此写法写成题解
代码实现原理:
一、对于每一行 每一列 都维护向左或上 连续的“.”的个数
二、对于每一个点 包含其点的矩形都可以用从当前位置到最左侧连续的点的位置的一个循环得出 代码如下
long long q=INT_MAX;
for(long long k=j;k>=j-a[j];k--){
    q=min(q,b[k]);ans+=q;//b数组维护向上连续的点的个数 可以想想为什么
}
ac代码:
#include<bits/stdc++.h>
using namespace std;
long long a[80010],n,m,ans,b[80010];//a数组维护向左连续点的长度 b数组维护向上连续点的长度;
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++){
    	for(int j=1;j<=n;j++){
    		char x;cin>>x;
    		if(x=='.'){
    			long long q=INT_MAX;
			    a[j]=a[j-1]+1;b[j]=b[j]+1;
    	        for(long long k=j;k>=j-a[j];k--){
    	        	q=min(q,b[k]);ans+=q;
				}
			}
    		else b[j]=a[j]=0;
		}
	}
	cout<<ans;
}

                
            
        
浙公网安备 33010602011771号