neuoj Blurred Pictures(小思维题

本文探讨了一道关于寻找最大正方形区域的问题,该区域由非模糊像素组成。利用所有非模糊像素相连的特点,提出了一个O(n)的解决方案,通过暴力移动边界来枚举可能的正方形边界,确保所选区域内的所有像素都是非模糊的。

https://oj.neu.edu.cn/problem/1505

题意:一张由n*n的照片,每行从第ai个像素点到第bi个像素点是非模糊点,要求找出最大的正方形,该正方形中的像素都是非模糊点。

思路:这题有个很巧的地方"luckily, all the non-blurred pixels are connected in such a way that any horizontal or vertical line drawn between two non-blurred pixels goes only through non-blurred pixels. "

这就否定了以下这种情况,那就可以O(n)暴力移动边界了,枚举第1~n行为上边界,ans从1开始,然后对于第i行判定ans是否可行,若可行则ans++继续该行的判定,否则i++开始下一行的判定。每次判定只需判定上边界和下边界两行即可。

11111

11100

11111

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int l[maxn],r[maxn];
int n;

inline bool check(int up,int d){
    if(l[up]+d-1>r[up]) return false;
    if(up+d-1>n) return false;
    int down = up+d-1;
    int left = max(l[up],l[down]);
    if(left+d-1<=r[up]&&left+d-1<=r[down]) return true;
    return false;
}


int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    while(cin>>n){
        for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
        int ans = 1;
        for(int i=1;i<=n;i++) {
            while(check(i,ans+1)) ++ans;
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/wzgg/p/11479030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值