zoukankan      html  css  js  c++  java
  • 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    题面

    BZOJ
    洛谷

    题解

    直接一个单调队列维护一下没给点和它前面的(n)个位置的最大值,再用一次单调队列维护连续(n)列的,每个数和前面(n)个数的最大值,最小值同理,就做完了。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MAX 1010
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int a,b,n,ans=2e9;
    int g[MAX][MAX];
    int s[2][MAX][MAX];
    int mx[MAX][MAX];
    int Q[MAX],h,t;
    void get(int p)
    {
    	for(int i=1;i<=a;++i)
    	{
    		h=1;t=0;
    		for(int j=1;j<=b;++j)
    		{
    			while(h<=t&&j-Q[h]>=n)++h;
    			while(h<=t&&g[i][Q[t]]<g[i][j])--t;
    			Q[++t]=j;mx[i][j]=g[i][Q[h]];
    		}
    	}
    	for(int j=n;j<=b;++j)
    	{
    		h=1;t=0;
    		for(int i=1;i<=a;++i)
    		{
    			while(h<=t&&i-Q[h]>=n)++h;
    			while(h<=t&&mx[Q[t]][j]<mx[i][j])--t;
    			Q[++t]=i;s[p][i][j]=mx[Q[h]][j];
    		}
    	}
    }
    int main()
    {
    	a=read();b=read();n=read();
    	for(int i=1;i<=a;++i)
    		for(int j=1;j<=b;++j)
    			g[i][j]=read();
    	get(0);
    	for(int i=1;i<=a;++i)
    		for(int j=1;j<=b;++j)
    			g[i][j]=-g[i][j];
    	get(1);
    	for(int i=n;i<=a;++i)
    		for(int j=n;j<=b;++j)
    			ans=min(ans,s[0][i][j]+s[1][i][j]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    TCP 协议如何保证可靠传输
    mysql 优化
    Navicat 导入导出
    Hibernate的优缺点
    寒假学习日报(十八)
    《机器学习十讲》第二讲总结
    寒假学习日报(十七)
    《设计原本》阅读笔记(二)
    《机器学习十讲》第一讲总结
    寒假学习日报(十六)
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9726445.html
Copyright © 2011-2022 走看看