首页 > 其他分享 >正方形鱼池题解

正方形鱼池题解

时间:2023-07-11 20:56:23浏览次数:42  
标签:node int 题解 tree 下界 正方形 枚举 maxn 鱼池

首先这道题\(T\)的范围很小,而\(N\)的范围却很大,所以我们只能枚举树
那么我们如何枚举呢,树有上下左右之分,看起来十分难枚举,现在让我们仔细分析一下:

水池的边长就等于\(min(上下界的距离,左右界的距离)\)

这时我们就可以开始枚举了,我枚举的是左右界

那么我们此时就可以发现上下界的两颗树一定在左右两颗树之间

为什么?

如图,如果说上下界在红色点的话,我们完全可以以这两个点为左右界,因为它们之间的距离显然更长

接下来我们就开始枚举了

第一步,按照\(x\)进行排序

第二步,初始化上下边界为墙,防止没有

第三步,两重循环,枚举所有树,再用两个变量存储上下界,注意\(j\)是\(i+1\),因为需要枚举左右边界,如果中间还有一个就不行了

枚举上下界如图

此时我们可以发现还有几种情况没有考虑,这里只解决了上下界至少有一棵树的情况

我们需要分类讨论:

两界或三界有墙 (如样例1)

我们可以进行转化

手动种树,就可以变成之前的情况了,注意我们要在坐标0种树,因为题目从1开始,这样正好提供了便利,不从0开始会漏掉

左右界至少有一棵树

我们根据上下界至少有一棵树的方式类推就可以了

ac代码

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

const int MAXT = 105;
int n, t;
struct node {
    int x, y;
} tree[MAXT];

bool cmp1(node a, node b) { return a.x < b.x; }

bool cmp2(node a, node b) { return a.y < b.y; }

int main() {
    scanf("%d%d", &n, &t);
    n++;
    for (int i = 1; i <= t; i++) scanf("%d%d", &tree[i].x, &tree[i].y);
    //四角种树
    tree[++t] = { 0, 0 }, tree[++t] = { 0, n };
    tree[++t] = { n, n }, tree[++t] = { n, 0 };
    //枚举左右界
    sort(tree + 1, tree + 1 + t, cmp1);
    int ans = 0;
    for (int i = 1; i <= t; i++) {
        int minn = 1, maxn = n;
        for (int j = i + 1; j <= t; j++) {
            if (maxn - minn - 1 < tree[j].x - tree[i].x - 1)
                break;
            ans = max(ans, tree[j].x - tree[i].x - 1);
            if (tree[j].y <= tree[i].y)
                minn = max(minn, tree[j].y);
            if (tree[j].y >= tree[i].y)
                maxn = min(maxn, tree[j].y);
        }
    }
    //枚举上下界
    sort(tree + 1, tree + 1 + t, cmp2);
    for (int i = 1; i <= t; i++) {
        int minn = 1, maxn = n;
        for (int j = i + 1; j <= t; j++) {
            if (maxn - minn - 1 < tree[j].y - tree[i].y - 1)
                break;
            ans = max(ans, tree[j].y - tree[i].y - 1);
            if (tree[j].x <= tree[i].x)
                minn = max(minn, tree[j].x);
            if (tree[j].x >= tree[i].x)
                maxn = min(maxn, tree[j].x);
        }
    }
    cout << ans;

    return 0;
}

标签:node,int,题解,tree,下界,正方形,枚举,maxn,鱼池
From: https://www.cnblogs.com/xiaozhu0602/p/17545891.html

相关文章

  • 题解 [NOIP2011 提高组] 聪明的质监员
    题目链接不难发现,\(W\)越大,\(y_i\)以及\(y\)就越小,\(W\)越小,\(y_i,y\)就越大。所以这是一个二分答案。考虑如何\(check\)。观察\[y_i=\sum\limits_{j=l_i}^{r_i}[w_j\geW]\times\sum\limits_{j=l_i}^{r_i}[w_j\geW]v_j\]不难发现,乘号的前后都是区间和的形式,有......
  • 【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN 无法打开相机 设置我的PIN 登
    \(弄了1.5个小时,找到这个视频,终于弄好了!!!!!!\)\(如果各位基友出现这种问题,可以参考。\)【开机10】解决出现问题,你的PIN不可用,单击以重新设置PIN无法打开相机设置我的PIN登录选项诊断启动禁用服务后问题解决......
  • 洛谷 P4869 albus就是要第一个出场 题解
    洛谷P4869albus就是要第一个出场题意给定一个长度为\(n\)的序列\(A\),设可重集合\(S=\left\{\operatorname{xor}_{i=1}^nA_ix_i\midx_i\in\{0,1\}\right\}\),即\(S\)为\(A\)的所有子集的异或和构成的集合。给定一个数\(k\),求\(k\)在\(S\)中的排名。如果\(S\)中......
  • AT_abc306_h 题解
    AT_abc306_hBalanceScale题解Links洛谷AtCoderDescription有\(N\)个编号为\(1,2,\dots,N\)的砝码。有\(M\)次比较操作,每次比较砝码\(A_{i}\)和\(B_{i}\),\(A_{i}\)在左侧。分为三种情况:左边的砝码更重。右边的砝码更重。两边的砝码重量相同。将每次比较的......
  • CF878E 题解
    CF878ENumbersontheblackboard题解Links洛谷CodeforcesDescription给出\(n\)个数字,每次询问一个区间\([l,r]\),对这个区间内部的点进行如下操作。每次操作可以合并相邻两个数\(x,y\),用\(x+2y\)替换它们。对于每次询问,输出当最后只剩下一个数字时,这个数字的最大......
  • CODE FESTIVAL 2017 Final J 题解
    problem&blog。萌萌点分治,积累个trick/qq。对于完全图\((V,E)\),将\(E\)分成\(E_1,E_2,\cdots,E_k\)(\(E_1\cupE_2\cup\cdots\cupE_k=E\))。对每个边集求MST,得到新边集\(E_1^{'},E_2^{'},\cdots,E_k^{'}\),再求MST。最终剩下的边集,等同于原边集的MST。......
  • P4016题解
    本题是一个比较经典的问题(环形均分纸牌问题),我也不知道为什么它在网络流24题里面出现。但是作为一道比较典的排序算法的题,还是放出来讲一下。solution假设\(a_1\)给\(a_n\)了\(x_1\)张纸牌,\(a_2\)给\(a_1\)了\(x_2\)张纸牌......(\(x_i\)可正可负)。因此操作数量为......
  • P2886题解
    题目大意给定起点\(S\)和终点\(T\),求从起点到终点恰好经过\(N\)(\(N\)给定)条边的最短路径。solution发现本题点数巨多,但是边数小到可怜,我们可以只保留了一部分点,先判断连通性,不连通直接输出即可。当\(S\)和\(T\)连通时,我们设\(G^k\)为经过\(k\)条边后最短路的邻......
  • Largest-Smallest-Cyclic-Shift题解
    题目链接本题码量不大,但是事实上是一道极其难想的思维题。题目描述你有\(a\)个a,\(b\)个b,\(c\)个c。要求用这\(a+b+c\)个字母拼接成一个字符串,使得这个字符串的最小表示法在所有能拼成的字符串中最大。补充:最小表示法,将一个字符串的最后一个字符放到首位,重复这个操作,......
  • AT-abc214-g题解
    题目描述给定两个排列\(p,q\),要求统计满足\(\foralli,r_i\not=p_i,r_i\not=q_i\)的排列\(r\)的数量。对\(1000000007\)取模数据范围\(n\le3000\)。solution本题要求统计数量,反正我想了半天没想到怎么正向统计(bushi),因此我们考虑容斥。设\(h_i\)为只看其中......