P7149 [USACO20DEC] Rectangular Pasture S

题目描述

Farmer John 最大的牧草地可以被看作是一个由方格组成的巨大的二维方阵(想象一个巨大的棋盘)。现在,有 N 头奶牛正占据某些方格(1≤N≤2500)。

Farmer John 想要建造一个可以包围一块矩形区域的栅栏;这个矩形必须四边与 x 轴和 y 轴平行,最少包含一个方格。请帮助他求出他可以包围在这样的区域内的不同的奶牛子集的数量。注意空集应当被计算为答案之一。

输入格式

输入的第一行包含一个整数 N。以下 N 行每行包含两个空格分隔的整数,表示一头奶牛所在方格的坐标 (x,y)。所有 x 坐标各不相同,所有 y 坐标各不相同。所有 x 与 y 的值均在 0…109 范围内。

输出格式

输出 FJ 可以包围的奶牛的子集数量。可以证明这个数量可以用 64 位有符号整数型存储(例如 C/C++ 中的long long)。

输入输出样例

输入 #1

4
0 2
1 0
2 3
3 5

输出 #1

13

显然,每行、每列都至多只有一个点。对行坐标排序,滤掉没有牛的行(这实际上相当于离散化)。设 a[i] 代表第 i 行的那头牛所在的列坐标。

考虑下侧木板在第 i 行,上侧木板在第 j 行的情况。为了避免相同情况重复计算(即围栏形状不同,但圈住的牛相同),第 i 行的牛和第 j 行的牛必须被圈住

  • 如果第 j 行的牛在第 i 行的牛左边(即 a[i]>a[j]):

    • 任何一头在 第 i 行与第 j 行之间,在第 j 行的牛左边 的牛,即满足 i,都可以作为左侧围栏所在位置的选项(如果不满足此条件,则第 j 行的牛无法被圈住);当然,第 j 行的牛本身(a[j])也可以作为左侧围栏所在位置的选项。

    • 任何一头在 第 i 行与第 j 行之间,在第 i 行的牛右边 的牛,即满足 ia[i] 的 k,都可以作为右侧围栏所在位置的选项(如果不满足此条件,则第 i 行的牛无法被圈住);当然,第 i 行的牛本身(a[i])也可以作为右侧围栏所在位置的选项。

  • 第 j 行的牛在第 i 行的牛右边(即 a[i]

所以,下侧木板在第 i 行,上侧木板在第 j 行的所有可能,即为 左侧围栏选项总数 × 右侧围栏选项总数

我们只需在枚举 i,j 的过程中,维护:

  • 对于第 i 行的牛,在第 i 行与第 j 行之间,有多少头牛在它的左边/右边;
  • 对于第 j 行的牛,有第 i 行与第 j 行之间,有多少头牛在它的左边/右边;

顺带累加答案,即可轻松完成此题。

时间复杂度为 O(N*N)。

#include 
#include 
using namespace std;
typedef long long ll;
#define MAXN 2505
ll N;
// 每头牛的行/列坐标
pair x[MAXN];
// 先算上空集
ll ans = 1;
// l[j]代表【第j行的牛】与【当前第i行的牛】之间,有多少头牛在【第j行的牛】左边
// r[j]同理
ll l[MAXN], r[MAXN];
int main() {
    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> x[i].first >> x[i].second;
    // 按行坐标排序
    sort(x, x + N);
    // 枚举i
    for (ll i = 0; i < N; i++) {
        ans++;
        // lt代表【第i行的牛】与【当前第j行的牛】之间,有多少头牛在【第i行的牛】左边
        // rt同理
        ll lt = 0, rt = 0;
        for (ll j = i - 1; j >= 0; j--) {
            // 根据【第i行的牛】与【第j行的牛】的相对位置,累加答案,更新计数
            if (x[i].second > x[j].second) {
                ans += (rt + 1) * (l[j] + 1);
                r[j]++;
                lt++;
            } else {
                ans += (lt + 1) * (r[j] + 1);
                l[j]++;
                rt++;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

你可能感兴趣的:(算法,数据结构)