首页 > 其他分享 >洛谷 P3397:地毯 ← “二维前缀和 + 二维差分”模板题

洛谷 P3397:地毯 ← “二维前缀和 + 二维差分”模板题

时间:2025-01-20 23:29:43浏览次数:3  
标签:y2 洛谷 int sum x2 二维 P3397 y1 x1

【题目来源】
https://www.luogu.com.cn/problem/P3397

【题目描述】
在 n×n 的格子上有 m 个地毯。
给出这些地毯的信息,问每个点被多少个地毯覆盖。

【输入格式】
第一行,两个正整数 n, m。意义如题所述。
接下来 m 行,每行两个坐标 (x1, y1) 和 (x2, y2),代表一块地毯,左上角是 (x1, y1),右下角是(x2, y2)。

【输出格式】
输出 n 行,每行 n 个正整数。
第 i 行第 j 列的正整数,表示 (i, j) 这个格子被多少个地毯覆盖。

【输入样例】
5 3
2 2 3 3
3 3 5 5
1 2 1 4

【输出样例】
0 1 1 1 0
0 1 1 0 0
0 1 2 1 1
0 0 1 1 1
0 0 1 1 1

【数据范围】
对于 20% 的数据,有 n≤50,m≤100。
对于 100% 的数据,有 n,m≤1000。

【样例解释】

覆盖第一个地毯后覆盖第一、二个地毯后  覆盖全部地毯后  
000000000001110
011000110001100
011000121101211
000000011100111
000000011100111

【算法分析】
● 暴力算法求解思路分析
时间复杂度为 O(n^3) 的算法,在算法竞赛中大约能处理规模为 1000 左右的数据不超时。
时间复杂度为 O(n^2) 的算法,在算法竞赛中大约能处理规模 ≤5000 左右的数据不超时。
本题数据规模很小,故采用时间复杂度较高的暴力算法求解时,也不会 TLE。

#include<iostream>
using namespace std;

const int maxn=1e3+5;
int a[maxn][maxn];

int main() {
    int n,m,x1,x2,y1,y2;
    cin>>n>>m;
    while(m--) {
        cin>>x1>>y1>>x2>>y2;
        for(int i=x1; i<=x2; i++) {
            for(int j=y1; j<=y2; j++) a[i][j]++;
        }
    }

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

/*
in:
5 3
2 2 3 3
3 3 5 5
1 2 1 4

out:
0 1 1 1 0
0 1 1 0 0
0 1 2 1 1
0 0 1 1 1
0 0 1 1 1
*/

● 二维前缀和
(1)构建二维差分数组
一维“前缀和数组”预处理过程:sum[i]=sum[i-1]+a[i]
一维“区间和”计算过程:sum[y]-sum[x-1]      (y≥x)
类比于一维“前缀和数组”预处理过程及一维“区间和”计算过程,可知:
二维“前缀和数组”预处理过程:sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
二维“区间和”计算过程:( sum[x2][y2] - sum[x2][y1-1] ) - ( sum[x1-1][y2] - sum[x1-1][y1-1] ) = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1]       (y2≥y1,x2≥x1)
(2)二维区域操作转端点操作
类比于一维区间操作转端点操作 d[le]+=x,d[ri+1]-=x,可以大大提升算法效率。可知,若二维区域的左上角坐标为 (x1, y1),右下角坐标为 (x2, y2),则如下代码可高效实现对此二维区域内所有元素 +1 的操作。

for(int i=x1; i<=x2; i++) {
    d[i][y1]++;
    d[i][y2+1]--;
}

推而广之,易得对二维区域内所有元素 +x 的代码为:d[i][y1]+=x,d[i][y2+1]-=x   (x1≤i≤x2)
(3)若已知差分数组 d[i][j],则由语句 a[i][j]=a[i][j-1]+d[i][j]; 可得到原始数组。其中,i∈[1,n]。

【算法代码:二维前缀和 + 二维差分】

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

const int maxn=1e3+5;
int a[maxn][maxn];
int d[maxn][maxn];
int n,m;

int main() {
    cin>>n>>m;
    while(m--) {
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        for(int i=x1; i<=x2; i++) {
            d[i][y1]++;
            d[i][y2+1]--;
        }
    }

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            a[i][j]=a[i][j-1]+d[i][j];
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

/*
in:
5 3
2 2 3 3
3 3 5 5
1 2 1 4

out:
0 1 1 1 0
0 1 1 0 0
0 1 2 1 1
0 0 1 1 1
0 0 1 1 1
*/




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/145251582
https://blog.csdn.net/hnjzsyjyj/article/details/120617603
https://blog.csdn.net/hnjzsyjyj/article/details/120265452
https://www.luogu.com.cn/problem/solution/P3397
https://blog.csdn.net/qq_34988204/article/details/137672082



 

标签:y2,洛谷,int,sum,x2,二维,P3397,y1,x1
From: https://blog.csdn.net/hnjzsyjyj/article/details/145268744

相关文章

  • 多通道二维卷积手动版+pytorch版本
    文章目录1.百度链接手动版2.Pytorch版本1.百度链接手动版通过网盘分享的文件:conv2dtest.xlsx链接:https://pan.baidu.com/s/1q3McqwfcKO1iX-Ms0BfAGA?pwd=ttsu提取码:ttsu2.Pytorch版本pythonimporttorchimporttorch.nnasnnimporttorch.nn.funct......
  • 二维差分
    1/*2二维差分的实际例题,差分演化3数据输入样例:43435122163221711118112219132321031341111213343规模:三行四列,经过三次操作14122115......
  • 二维差分
    https://www.cnblogs.com/Rogerliu/p/186695871/*2视频地址:https://www.bilibili.com/video/BV1ga4y1F7Mj?t=3.1概念理论讲解3视频地址:https://www.bilibili.com/video/BV1ga4y1F7Mj?t=851.3开始通过例题讲解,题目参考同名图片名:二维差分.png4......
  • 洛谷P1807 最长路(拓扑排序)
    题目链接:P1807最长路-洛谷|计算机科学教育新生态题目描述设 G 为有 n 个顶点的带权有向无环图,G  中各顶点的编号为 1 到 n,请设计算法,计算图 GG中 1,n 间的最长路径。输入格式输入的第一行有两个整数,分别代表图的点数 n 和边数 m。第 2 到第 (m+1)......
  • 洛谷P1246 编码(运用组合数学解决问题)
    传送门:编码-洛谷题目描述编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有 2626 个字母 a,b,c,⋯ ,za,b,c,⋯,z,这些特殊的单词长度不超过 66 且字母按升序排列。把所有这样的单词放在一起,按字典......
  • 洛谷 P11388 [COCI 2024/2025 #1] 飞跃 / Skokovi
    #[COCI2024/2025#1]飞跃/Skokovi##题目背景译自[COCI2024/2025#1](https://hsin.hr/coci/)T2。$\texttt{5s,0.5G}$。满分为$75$。##题目描述有$n$朵花,此外有一个正整数$k$。第$i$朵花的高度为$a_i$。一开始,Filip在第$1$朵花上。当她在第$i$朵花......
  • (pdm集成CAD SDK)在线CAD绘制条形码、二维码的教程
    一、条形码绘制1.原理绘制条形码需要根据不同的应用场景选择适当的条形码标准,如常见的codabar、CODE30、CODE128等,每一种条形码标准都有它特定的数据编码规则,调用这些编码规则进行数据编码时会将数据字符按照所选编码规则转换成条和空的组合(一组二进制数据)。不同的条形码标准......
  • 【最大生成树】洛谷P2700 逐个击破
    P2700逐个击破#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=2e5+10,M=N;intn,k;LLres,sum;boolst[N];intp[N];structEdge{ inta,b,w; booloperator......
  • 【搜索】洛谷P1123 取数游戏
    P1123取数游戏搜索顺序:按格子枚举。思想类比AcWing843.n-皇后问题按格子枚举方法,以及AcWing1116.马走日AcWing1117.单词接龙AcWing1118.分成互质组,体会恢复现场写在for循环内部与写在for循环外部的区别。最大的区别:恢复现场写在for循环外可以不用清空标记数组。......
  • 【洛谷P1303】高精度乘法
    A*BProblem题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过10^{2000}。入坑OI这么久发现还没有写过......