二维前缀和
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N= 1e3+3;
int n, m;
long long q,t,a[N][N];
int main(){
cin>>n>>m>>q;
for(int i= 1; i<= n; i++)
for(int j= 1; j<= m; j++){
cin>>t;
a[i][j]= t+a[i][j-1]+a[i-1][j]-a[i-1][j-1];
}
while(q--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<a[x2][y2]-a[x2][y1-1]-a[x1-1][y2]+a[x1-1][y1-1]<<endl;
}
return 0;
}
解决一个计算矩阵子区域和的问题。程序首先读取三个整数:n
、m
和 q
,分别代表一个 n×m
矩阵的行数和列数以及查询次数。接着,对于给定的矩阵,程序动态计算每个单元格的累加和,并存储在二维数组 a
中。
初始时,用户逐个输入矩阵的每一个元素 t
,然后按照一定的规则更新 a[i][j]
的值,规则是基于当前位置 [i][j]
右边、下边以及右下角相邻单元格的累加和,计算公式如下:
a[i][j] = t + a[i][j-1] + a[i-1][j] - a[i-1][j-1];
这个公式实际上是在计算当前位置元素加上其上方和左方元素的累加和,但同时减去左上角元素的累加和,这样可以避免重复计算,使得整个矩阵的任意矩形区域和可以通过四角元素的累加和快速计算得出。接下来,程序会执行 q
次查询,每次查询接收四个坐标 (x1, y1, x2, y2)
分别代表一个矩形区域的左上角和右下角坐标。对于每次查询,程序计算并输出矩形区域 (x1, y1)
到 (x2, y2)
内所有元素的和,利用之前预计算好的累加和数组 a
直接得出结果,计算公式如下:
result = a[x2][y2] - a[x2][y1-1] - a[x1-1][y2] + a[x1-1][y1-1];
最长上升子序列
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const int N = 1e5 +5;
int n,a[N];
vector<int>v;
int main()
{ cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
v.push_back(a[1]);
for(int i=2;i<=n;i++)
{
if(a[i]>v.back())
v.push_back(a[i]);
else *lower_bound(v.begin(),v.end(),a[i])=a[i];
}
cout<<v.size();
return 0;
}