什么是单调栈?
单调栈是一种先进后出并且栈中数据有序的一种数据结构。
分享一个很详细的博客:传送门
单调队列
分享博客:传送门
例题:
#include<iostream>
#include<cmath>
using namespace std;
const int N=5010;
typedef long long ll;
int row[N][N],a[N],c[N],q[N],w[N][N];
int n,m,k;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
void get_max(int a[],int b[],int tot)
{
int head=0,tail=-1;
for(int i=1;i<=tot;i++)
{
if(head<=tail&&q[head]<=i-k) head++;
while(head<=tail&&a[q[tail]]<=a[i]) tail--;
q[++tail]=i;
b[i]=a[q[head]];
}
}
int main( )
{
ll sum=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
w[i][j]=lcm(i,j);
for(int i=1;i<=n;i++)
{
get_max(w[i],row[i],m);
}
for(int i=k;i<=m;i++)
{
for(int j=1;j<=n;j++) a[j]=row[j][i];
get_max(a,c,n);
for(int j=k;j<=n;j++) sum+=c[j];
}
cout<<sum;
return 0;
}