單調佇列寫法。
py&hyh
想脫單
description
總所周知,,
py和hyh有十分濃烈的脫單意願,但是非常不幸,在乙個風和日麗的下午,他們穿越到乙個沒有妹子的世界,他必須回答乙個問題才能回到本來的世界,這個問題是給出乙個
nm的矩陣,然後有
q次操作,每乙個操作,給出
xi,yi,ti,
表示在ti
時刻摧毀
(xi,yi)
這個格仔,然後他們要求出乙個最早時刻,出現至少乙個
kk的矩陣被毀壞,注意:乙個
kk矩陣被毀壞的意思是某乙個
kk的矩陣中的每乙個格仔都被摧毀過一次或一次以上。聰明的
acmer
能幫他們回答這個問題嗎(如果沒人能
ac這個題,就代表他們兩個沒有脫單的可能了哦)
input
input
:採用多組輸入第一行輸入
n,m,k,q,(1 ≤ n, m ≤ 500, 1 ≤ k ≤ min(n, m), 1 ≤ q ≤ n·m)
分別代表
nm的矩陣,
kk的矩陣,和
q次操作接下來
q行每一行輸入
xi,yi,ti(1 ≤ xi ≤ n, 1 ≤ yi ≤ m, 0 ≤ t ≤ 1e6)
,代表,在
ti這個時刻,xi,
yi這個位置會被摧毀
output
out:輸出一行,代表最早時刻出現至少乙個
k*k的矩陣被毀壞如果永遠不存在這乙個時刻,輸出-1
sample input 1
2 3 2 5
2 1 8
2 2 8
1 2 1
1 3 4
2 3 2
sample output 1 8
sample input 2
3 3 2 5
1 2 2
2 2 1
2 3 5
3 2 10
2 1 100
sample output 2 -1
題意:自己看。
解法:標程是二分+二維字首和,我個人覺得雙向佇列寫法更優。
首先每行 記錄 mp[i][ j-k , j ]區間的最大值,再在得到每行每個區間最大值的條件下再次記錄 每列的最大值 mp[i-k,i][j];
這中寫法只要會用雙向佇列來維護單調佇列,就很好些。
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairp;
#define bug printf("*********\n");
#define debug(x) cout<<"["int mp[maxn][maxn];
int mp2[maxn][maxn]; //開個mp2記錄下每行乙個區間的最大值
int main()
for(int i=1; i<=n; i++)
while(dq.size()>0&&dq.front()=mp[i][j])
mp2[i][j]=dq.back();
}dq.clear();
}for(int i=k; i<=m; i++)
while(dq.size()>0&&dq.front()=mp2[j][i])
mp[j][i]=dq.back();
}dq.clear();
}int res=inf;
for(int i=k; i<=n; i++)
}if(res>1e6+1)res=-1;
printf("%d\n",res);
}return 0;
}
2015省賽選拔
arc and point 幾何弱成狗 block toy 3維版本的鋪磚,狀態壓縮dp。four coloring of a map giving directions to the tree just another pachinko like machine biggest number 搜尋...
NYNU 省賽選拔題 8
一天萌萌噠孟孟學長去博物館參觀,他想看到更多的東西。博物館可以表示為n m細胞的乙個矩形區域。表示為路,表示為牆壁,每個牆壁上面都掛有美麗的畫卷。孟孟學長可以看到與他所在位置相鄰的牆壁上面的畫卷。他有很多時間,所以他會沿著路走,只要路是通的每一張都可以看到。第一行輸入3個數n m k 3 n,m 1...
NYNU 省賽選拔題 3
二叉樹,若其與自己的映象完全相同,就稱其為映象樹。是一棵映象樹 而不是映象樹。現給你一棵二叉樹,請你判斷其是不是映象樹。第一行是乙個整數數t,表示測試資料有多少組 每組資料第一行是乙個正整數n 1 n 100 表示二叉樹中節點的數量 下面n行,每行有三個正整數a b c 1 a 100,0 b,c ...