Counting Rectangles

传送门

题意:
有q次查询,每次 hs, ws, hb, wb, 要求对于所有n个矩阵能够满足 hs < hi < hb && ws < wi < wb, 所有满足条件的矩阵的面积和


思路:
想破天了想不出,但是get到了新技能,可以构造二维前缀和,二维前缀和具体看代码吧,利用数学的加减性质即可,可以推出最后的答案就是\(S_{hb - 1, wb - 1} - S_{hb - 1, ws} - S_{hs, wb - 1} + S_{hs, ws}\)

总结:
先分析时间复杂度,按照时间复杂度想算法,如果真的没办法,学习吧,二维前缀和,矩阵覆盖分析

点击查看代码
#include <bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false);
using namespace std;

typedef long long ll;
const int MAXN = 1E3 + 10;
int T, n, q;
ll sum[MAXN][MAXN];

void init()
{
    for (int i = 1; i <= 1000; ++i)
    {
        for (int j = 1; j <= 1000; ++j)
        {
            sum[i][j] = 0;
        }
    }
}

int main()
{
	IOS; cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--)
    {
        cin >> n >> q;
        init();
        int hi, wi;
        for (int i = 1; i <= n; ++i)
        {
            cin >> hi >> wi;
            sum[hi][wi] += hi * wi;
        }

        for (int i = 1; i <= 1000; ++i)
        {
            for (int j = 1; j <= 1000; ++j)
            {
                sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
            }
        }
        
        while (q--)
        {
            int hs, ws, hb, wb;
            cin >> hs >> ws >> hb >> wb;
            cout << sum[hb - 1][wb - 1] - sum[hb - 1][ws] - sum[hs][wb - 1] + sum[hs][ws] << endl;
        }

    }
	return 0;
}

posted @ 2022-09-17 23:12  YUGUOTIANQING  阅读(33)  评论(0)    收藏  举报