刷过一题之矩阵最小值

Posted

tags:

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

输入

第一行n和m,表示行数和列数
接下来n行表示矩阵
再来一行一个整数q,表示询问个数
接下来q行,每行四个整数x1,y1,x2,y2表示左上右下的坐标

 

输出

对于每个询问输出一个整数表示该矩阵范围内的整数和

 

输入示例

5 5
1 2 5 4 1
1 1 7 6 8
8 7 9 5 2
4 4 4 1 8
5 10 11 13 7
3
2 1 4 3
2 2 5 5
4 1 5 4

 

输出示例

45
103
52

 

n,m < 2001
q < 100001
矩阵内所有数小于2000

 

前缀和,区间覆盖问题。想一想数学中的集合与公共面积。

 

技术分享
 1 #include<iostream>
 2 #define ll long long
 3 using namespace std;
 4 int a,b;
 5 int x,y,x1,y1;
 6 ll n[2050][2050];
 7 int read()
 8 {
 9     int x=0,f=1;
10     char ch=getchar();
11     while(ch<0||ch>9) {if(ch==-) f=-1;ch=getchar();}
12     while(ch>=0&&ch<=9) {x=x*10+ch-0;ch=getchar();}
13     return x*f;
14 }
15 int main()
16 {
17     a=read();
18     b=read();
19     for(int i=1;i<=a;i++)
20         for(int j=1;j<=b;j++)
21         {
22             n[i][j]=read();
23             n[i][j]=n[i][j]+n[i][j-1]+n[i-1][j]-n[i-1][j-1];
24         }
25     int q;
26     q=read();
27     for(int i=0;i<q;i++)
28     {
29         x=read();
30         y=read();
31         x1=read();
32         y1=read();
33         ll ans=n[x1][y1]-n[x1][y-1]-n[x-1][y1]+n[x-1][y-1];
34         printf("%lld\n",ans);
35     }
36     //system("pause>nul");
37     return 0;
38 }
View Code

 

以上是关于刷过一题之矩阵最小值的主要内容,如果未能解决你的问题,请参考以下文章

刷过一题之NOIP2007守望者的逃离

刷过一题之NOIP2012寻宝

刷过一题之NOIP2013花匠

刷过一题之NOIP2013转圈游戏

刷过一题之NOIP2013表达式求值

leetcode每日一题-598:范围求和