bzoj4302 Hdu 5301 Buildings

Posted 逢山开路 遇水架桥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4302 Hdu 5301 Buildings相关的知识,希望对你有一定的参考价值。

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4302

【题解】

出自2015多校-学军

题意大概是给出一个n*m的格子有一个格子(x,y)是坏的,用一些矩形覆盖没有坏的格子,使得每个矩形都有一面靠着边界。求最大的矩形的面积最小。

稍微分析就会发现肯定是1*x的矩形最优,因为如果是2*x可以分成2个1*x。

那么我们先把矩形转转位置,使得n<=m,且(x,y)在左上角。

矩形内没有坏点,显然方案是(n+1)/2

我们画个图,黑色的那个是坏点,我们发现要处理坏点有2种方法

(其中红色的为处理坏点的,绿色的为正常的答案)

显然是这两种方案中选一个花费最小的。

答案就是max((n+1)/2, min(n-x,y))

有一种特殊情况需要特判就是:n=m,且坏点在正方形正中心,答案是x-1

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n, m, x, y, ans;

int main() {
    while(~scanf("%d%d%d%d", &n, &m, &x, &y)) {
        if(n > m) swap(n, m), swap(x, y);
        x = min(x, n-x+1), y = min(y, m-y+1);
        if(n == m && (n&1) && x == (n+1)/2 && x == y) ans = x-1;
        else ans = max((n+1)/2, min(n-x, y));
        printf("%d\\n", ans);
    }
    return 0;
}
View Code

 

以上是关于bzoj4302 Hdu 5301 Buildings的主要内容,如果未能解决你的问题,请参考以下文章

hdu5301(2015多校2)--Buildings(构造)

BZOJ5301CQOI2018异或序列(莫队)

HDU 5301 Buildings(2015多校第二场)

BZOJ5301:[CQOI2018]异或序列——题解

图解hdu5301Buildings

HDU 4302 贪吃蛇