BZOJ 1047 理想的正方形 單調佇列

2022-05-27 01:09:11 字數 1659 閱讀 9773

剛開始用二維rmq直接給超記憶體了。。。

用單調佇列可以做到o(n^2)的複雜度。具體是先把每行用單調佇列處理一下。再把處理後的用列單調佇列處理下。

# include # include 

# include

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

# define lowbit(x) ((x)&(-x))

# define pi acos(-1.0

)# define eps 1e-9

# define mod

12345678

# define inf

1000000000

# define mem(a,b) memset(a,b,

sizeof

(a))

# define for(i,a,n)

for(int i=a; i<=n; ++i)

# define fo(i,a,n)

for(int i=a; ii)

# define bug puts("h

");# define lch p

<<1

,l,mid

# define rch p

<<1|1,mid+1

,r# define mp make_pair

# define pb push_back

typedef pair

pii;

typedef vector

vi;# pragma comment(linker,

"/stack:1024000000,1024000000")

typedef

long

long

ll;int

scan()

void out(int

a)

if(a>=10) out(a/10

); putchar(a%10+'0'

);}const

int n=1005;//

code begin...

intval[n][n], row_max[n][n], row_min[n][n], col_max[n][n], col_min[n][n], que[n], head, tail;

intmain ()

head=-1; tail=0

; for(j,

1,m)

}for(j,

1,m-a+1

) head=-1; tail=0

; for(i,

1,n)

}int ans=inf;

for(i,

1,n-a+1) for(j,1,m-a+1) ans=min(ans,col_max[i][j]-col_min[i][j]);

printf(

"%d\n

",ans);

return0;

}

view code

BZOJ1047 理想的正方形

time limit 10 sec memory limit 162 mb submit 4137 solved 2326 有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值 的差最小。第一行為3個整數,分別表示a,b,n的值第二行至第a 1行每行...

BZOJ 1047 理想的正方形

bzoj 1047 傳送門 1 先橫向用單調佇列求出每個數左邊 n 個數中的最值 2 再縱向利用橫向的結果用單調佇列進行相同的操作 通過以上操作將 a b 的矩陣轉化為了 a n 1 b n 1 的矩陣 相當於每個正方形被縮成了乙個點,而每個點的最值就代表著原正方形中的最值 tip 1 又被 1 2...

BZOJ 1047 理想的正方形

看到這到題,第一反應當然是暴搜一遍,但是資料較大,暴搜鐵定過不了,自然想到進行優化,優化的方案很多,每個人的思路可能不同,在這裡我的思路僅供參考。我的想法是用單調佇列 單調棧,當然簡單的單調佇列 單調棧只適用於一行資料,對於這道題要進行一定的組合和變換。根據題目的介紹,可以大致總結出以下資訊 第一,...