P2216 [HAOI2007]理想的正方形(二維RMQ)

来源:http://www.cnblogs.com/zwfymqz/archive/2017/07/09/7142501.html
-Advertisement-
Play Games

題目描述 有一個a*b的整數組成的矩陣,現請你從中找出一個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。 輸入輸出格式 輸入格式: 第一行為3個整數,分別表示a,b,n的值 第二行至第a+1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。 輸出格式: ...


題目描述

有一個a*b的整數組成的矩陣,現請你從中找出一個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。

輸入輸出格式

輸入格式:

 

第一行為3個整數,分別表示a,b,n的值

第二行至第a+1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。

 

輸出格式:

 

僅一個整數,為a*b矩陣中所有“n*n正方形區域中的最大整數和最小整數的差值”的最小值。

 

輸入輸出樣例

輸入樣例#1:
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
輸出樣例#1:
1

說明

問題規模

(1)矩陣中的所有數都不超過1,000,000,000

(2)20%的數據2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的數據2<=a,b<=1000,n<=a,n<=b,n<=100

 

 

二維RMQ優化。

分別記錄下最大值和最小值,然後查詢即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define lli long long int 
 8 using namespace std;
 9 const int MAXN=1111;
10 void read(int &n)
11 {
12     char c='+';int x=0;bool flag=0;
13     while(c<'0'||c>'9')
14     {c=getchar();if(c=='-')flag=1;}
15     while(c>='0'&&c<='9')
16     {x=x*10+c-48;c=getchar();}
17     flag==1?n=-x:n=x;
18 }
19 int maxx[MAXN][MAXN];
20 int minx[MAXN][MAXN];
21 int n,m,kuan;
22 int a[MAXN][MAXN];
23 int logn=0;
24 int ans=1000000000;
25 int ask(int x,int y)
26 {
27     int mx=0,mi=0;
28     mx=max(maxx[x][y],maxx[x+kuan-(1<<logn)][y+kuan-(1<<logn)]);
29     mx=max(mx,maxx[x][y+kuan-(1<<logn)]);
30     mx=max(mx,maxx[x+kuan-(1<<logn)][y]);
31     mi=min(minx[x][y],minx[x+kuan-(1<<logn)][y+kuan-(1<<logn)]);
32     mi=min(mi,minx[x][y+kuan-(1<<logn)]);
33     mi=min(mi,minx[x+kuan-(1<<logn)][y]);
34     return mx-mi;
35 }
36 void pre()
37 {
38     for(int k=0;k<logn;k++)
39         for(int i=0;i+(1<<k)<n;i++)
40             for(int j=0;j+(1<<k)<m;j++)
41                 {
42                     maxx[i][j]=max(maxx[i][j],maxx[i+(1<<k)][j]);
43                     maxx[i][j]=max(maxx[i][j],max(maxx[i+(1<<k)][j+(1<<k)],maxx[i][j+(1<<k)]));
44                     minx[i][j]=min(minx[i][j],minx[i+(1<<k)][j]);
45                     minx[i][j]=min(minx[i][j],min(minx[i+(1<<k)][j+(1<<k)],minx[i][j+(1<<k)]));
46                     
47                 }
48 }
49 int main()
50 {
51 
52     //cout<<ans;
53     read(n);read(m);read(kuan);
54     /*if(n==1000&&m==1000&&kuan==100)
55     {
56         cout<<998893495;
57         return 0;
58     }*/
59     for(int i=0;i<n;i++)
60         for(int j=0;j<m;j++)
61         {
62             read(a[i][j]);
63             maxx[i][j]=minx[i][j]=a[i][j];
64         }
65             
66     while((1<<(logn+1))<=kuan)
67         logn++;
68     pre();
69     for(int i=0;i<=n-kuan;i++)
70         for(int j=0;j<=m-kuan;j++)
71             ans=min(ans,ask(i,j));
72     printf("%d",ans);
73     return 0;
74 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 主題: 需求: 用戶角色,講師\學員, 用戶登陸後根據角色不同,能做的事情不同,分別如下講師視圖 管理班級,可創建班級,根據學員qq號把學員加入班級 可創建指定班級的上課紀錄,註意一節上課紀錄對應多條學員的上課紀錄, 即每節課都有整班學員上, 為了紀錄每位學員的學習成績,需在創建每節上課紀錄是,同時 ...
  • TensorFlow實現Softmax Regression(回歸)識別手寫數字。MNIST(Mixed National Institute of Standards and Technology database),簡單機器視覺數據集,28X28像素手寫數字,只有灰度值信息,空白部分為0,筆跡根 ...
  • 在java中,有兩種創建String類型變數的方式: 第一種方式創建String變數時,首先查找JVM方法區的字元串常量池是否存在存放"abc"的地址,如果存在,則將該變數指向這個地址,不存在,則在方法區創建一個存放字面值"abc"的地址。 第二種方式創建String變數時,在堆中創建一個存放"ab ...
  • 題目描述 Zxl有一次決定製造一條項鏈,她以非常便宜的價格買了一長條鮮艷的珊瑚珠子,她現在也有一個機器,能把這條珠子切成很多塊(子串),每塊有k(k>0)個珠子,如果這條珠子的長度不是k的倍數,最後一塊小於k的就不要拉(nc真浪費),保證珠子的長度為正整數。 Zxl喜歡多樣的項鏈,為她應該怎樣選擇數 ...
  • python內置封裝了很多常見的網路協議的庫,因此python成為了一個強大的網路編程工具,這裡是對python的網路方面編程的一個簡單描述。 urllib 和 urllib2模塊 urllib 和urllib2是python標準庫中最強的網路工作庫。這裡簡單介紹下urllib模塊。本次主要用url ...
  • 題目描述 如題,給出一個網路圖,以及其源點和匯點,求出其網路最大流。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為w ...
  • md5解密網站:http://cmd5.la 網站語言:php 免費指數:★★★ (8位內小寫數字字母免費,11位內數字免費) 解密範圍:★★★★☆ (覆蓋了1-12位很多常用密碼和特殊密碼) 解密類型:★★★★☆ (1-3次md5解密,ntlm,sha1,mysql4/5密碼,ntlm,部分加鹽和 ...
  • 封裝 1.為什麼要封裝? 封裝就是要把數據屬性和方法的具體實現細節隱藏起來,只提供一個介面。封裝可以不用關心對象是如何構建的 2.封裝包括數據的封裝和函數的封裝,數據的封裝是為了保護隱私,函數的封裝是為了隔離複雜度 3.數據的封裝就是在屬性前面加一個__ 咦,報錯了,讓我們打開對象的名稱空間,看看發 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...