Fake Maxpooling 2020 牛客多校第二场f题(两次单调队列维护矩阵最大值)

题目链接

https://ac.nowcoder.com/acm/contest/5667/F

自闭多校第二场 比第一场友好一点
d题签到题 比上一场的签到题友好多了
f题之前一直觉得能做但是不晓得咋做
听学长说用单调队列处理两次
当时觉得好麻烦 然后没写一直划水
赛后看了下题解 自己写了下感觉其实还好
就是第二次维护错了数组 wa了蛮多发
太不细心了

题目思路

首先根据题目意思用lcm直接求出每一位的值(按出题人的说法 这么直接求好像会t 但是并没有 估计是数据水了)然后按行和列做两次单调队列维护最大值并记录 最后相加就好了

ac代码


```#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 5e3+10;
const int inf = 0x1f1f1f1f;
const int mod = 2333;

int gcd(int x,int y)
{
    return y?gcd(y,x%y):x;
}

int lcm(int x,int y)
{
    return x/gcd(x,y)*y;
}

int mp[maxn][maxn],q[maxn],a[maxn][maxn];

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            mp[i][j]=lcm(i,j);
        }
    }
    //单调队列先维护每一行的长度为k的区间的最大值 并记录下来
    for(int i=1;i<=n;i++)
    {
        int head=0,tail=0;
        for(int j=1;j<=m;j++)
        {
            while(head<tail&&j-q[head]+1>k)head++;
            while(head<tail&&mp[i][q[tail-1]]<=mp[i][j])tail--;
            q[tail++]=j;
            a[i][j]=mp[i][q[head]];
        }
    }
    //在对上面记录的数组维护列的最大值 之前搞错了一直在维护开始的数组列最大值 wa了好多发
    for(int j=1;j<=m;j++)
    {
        int head=0,tail=0;
        for(int i=1;i<=n;i++)
        {
            while(head<tail&&i-q[head]+1>k)head++;
            while(head<tail&&a[q[tail-1]][j]<=a[i][j])tail--;
            q[tail++]=i;
            a[i][j]=a[q[head]][j];
        }
    }
    ll ans=0;
    for(int i=k;i<=n;i++)
    {
        for(int j=k;j<=m;j++)
        {
            ans+=a[i][j];
        }
    }
    printf("%lld\n",ans);
}

你可能感兴趣的:(Fake Maxpooling 2020 牛客多校第二场f题(两次单调队列维护矩阵最大值))