[模拟赛] 建房 (二分)

[模拟赛] 建房

题目描述

ufo有一片矩形的土地。
ufo认为:这片土地可以视为一个n*m的矩阵,他打算在土地上盖房子,房子的价值等于所占土地的4个角上的数的最小值。
ufo对房子有一些简单的小要求:
1、房子是矩形的,且四条边必须平行于土地的边界。
2、房子的长和宽均不得小于2。
ufo想让你算一算:他的房子最大价值是多少。

输入

第一行2个整数n,m。
接下来n行,m列,描述ufo的土地。

输出

一行,一个整数表示ufo房子的最大价值。

样例输入

3 3
1 2 3
4 5 6
7 8 9

样例输出

5

提示

对于30%的数据 n<=100,m<=100,0<=矩阵中的数<=10000
对于另外20%的数据 0<=矩阵中的数<=1
对于100%的数据 n<=1000,m<=1000,0<=矩阵中的数<=10000000000

Solution

30分:模拟即可
50分:在30分的前提下,扫描矩阵中的1,对于第i行,若第j,k列都是1,则标记vis[j][k]=1,如果一个数组被标记了两次,则输出1
100分:二分,扫描矩阵,大于mid的记为1,否则记为0,然后结合50分的判定,可以AC

 for(lol i=1,top=0;i<=n;i++) {
        for(lol j=1;j<=m;j++)
            if(v[i][j]>=mid) s[++top]=j;
        for(lol j=1;j<top;j++) {
            for(lol k=j+1;k<=top;k++) {
                if(t[s[j]][s[k]]) return 1;
                t[s[j]][s[k]]=1;
            }
        }
    }return 0;

这个验证看似是\(O(n^3)\)的,但是由于状态只有\(n^2\)个,所以在扫到\(n^2\)个后一定会\(return\)

Code

#include<bits/stdc++.h>
#define rg register
#define lol long long
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
#define in(i) (i=read())
using namespace std;
const lol N=1010,inf=2e9;
lol read() {
    lol ans=0,f=1; char i=getchar();
    while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
    while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
    return ans*f;
}
lol n,m,ans,v[N][N],t[N][N],maxn,s[N];

lol check(lol mid) {
    memset(t,0,sizeof(t));
    for(lol i=1,top=0;i<=n;i++) {
        for(lol j=1;j<=m;j++)
            if(v[i][j]>=mid) s[++top]=j;
        for(lol j=1;j<top;j++) {
            for(lol k=j+1;k<=top;k++) {
                if(t[s[j]][s[k]]) return 1;
                t[s[j]][s[k]]=1;
            }
        }
    }return 0;
}

int main()
{
    //freopen("build.in","r",stdin);
    //freopen("build.out","w",stdout);
    lol c=0; in(n),in(m);
    if(n<2 || m<2) cout<<"0"<<endl,exit(0);
    for(rg lol i=1;i<=n;i++)
        for(rg lol j=1;j<=m;j++)
            in(v[i][j]),maxn=max(maxn,v[i][j]);
    lol l=0,r=maxn;
    while(l<r) {
        lol mid=l+r+1>>1;
        if(check(mid)) l=mid;
        else r=mid-1;
    }cout<<l<<endl;
}

博主蒟蒻,随意转载.但必须附上原文链接

http://www.cnblogs.com/real-l/

原文地址:https://www.cnblogs.com/real-l/p/9756060.html

时间: 2024-10-11 21:33:19

[模拟赛] 建房 (二分)的相关文章

CUGBACM_Summer_Tranning3 2013长沙现场赛(二分+bfs模拟+DP+几何)

A题:二分 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 用lower_bound可以轻松解决,不过比赛的时候逗逼了. 刚开始没有预处理,所以队友给出一组数据的时候没通过,然后一时紧张又想不出什么好的解决办法,所以就没再继续敲代码.实在有点可惜了. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #includ

[模拟赛10.12] 老大 (二分/树的直径/树形dp)

[模拟赛10.12] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n ? 1 条边的无向连通图),由于新建的办公室太大以至于要将奖杯要分放在两个不同的地方以便同学们丢硬币进去开光,OB 想请你帮帮他看看奖杯放在哪两个办公室使得在任意一个在劳模办公室做题的小朋友能最快地找到奖杯来开光. 一句话题意:给出一个 n 个点的树,在两个合适且不同的点放上奖杯,使得每个点到最近的奖杯距离最大值最小. 输入

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

ZROI 19.08.07模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "正睿从来没有保证,模拟赛的题目必须原创." "文案不是我写的,有问题找喵老师去."--蔡老师 A R爷再次翻车,搞出来了一道六年前的CF题. \(100pts:\) 然而不是原题也很简单,斜率优化板子,单调队列搞一下就完事了. 也可以wqs二分,复杂度可以做到\(O(m\log m)\),\(与\)p\(无关.所以R爷差点把\)p$出到\(10^5\). B 本题乱搞做法非常多,所以R爷动用了权限来

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设