日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2019牛客暑期多校训练营(第三场)F - Planting Trees (枚举 + 单调队列)

發(fā)布時(shí)間:2024/4/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2019牛客暑期多校训练营(第三场)F - Planting Trees (枚举 + 单调队列) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接

題意

有一個N2N^2N2的矩陣N∈(1,500)N \in (1,500)N(1,500),求一個最大的子矩陣使子矩陣中最大值和最小值差不超過M∈(0,105)M \in (0, 10^5)M(0,105),總的樣例N3≤2.5×108N^3 \le 2.5 \times 10^8N32.5×108

思路

枚舉矩陣的上下界,然后枚舉右端點(diǎn),同時(shí)維護(hù)兩個單調(diào)隊(duì)列,最大值遞增,最小值遞減(這樣能保證如果單調(diào)隊(duì)列中頭元素合法之后的都可以滿足MMM的限制關(guān)系),這樣就可以得到一個合法的最左邊界。
復(fù)雜度:O(N3)O(N^3)O(N3)

#include <bits/stdc++.h> const int maxn = 5e2 + 1; const int inf = 0x3f3f3f3f; using namespace std; int a[maxn][maxn]; int up[maxn], down[maxn]; int q[maxn][2]; int main() {int T;cin >> T;while (T--) {int n, m;cin >> n >> m;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {cin >> a[i][j];}}int ans = 1;for (int i = 1; i <= n; ++i) { // 上界for (int j = 1; j <= n; ++j) {up[j] = -inf;down[j] = inf;}for (int j = i; j <= n; ++j) { // 下界for (int k = 1; k <= n; ++k) { // 更新列的最值up[k] = max(up[k], a[j][k]);down[k] = min(down[k], a[j][k]);}int l = 1, h0 = 0, h1 = 0, t0 = 1, t1 = 1;for (int r = 1; r <= n; ++r) { // 枚舉右端點(diǎn)while (h0 >= t0 && down[q[h0][0]] >= down[r]) h0--; // 最大值遞增while (h1 >= t1 && up[q[h1][1]] <= up[r]) h1--; // 最小值遞減q[++h0][0] = q[++h1][1] = r;while (l <= r && up[q[t1][1]] - down[q[t0][0]] > m) { // 不滿足m,左區(qū)間L++l++;while (t1 <= h1 && q[t1][1] < l) ++t1; // 更新隊(duì)列頭指針while (t0 <= h0 && q[t0][0] < l) ++t0;}ans = max(ans, (r-l+1) * (j-i+1));}}}cout << ans << endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的2019牛客暑期多校训练营(第三场)F - Planting Trees (枚举 + 单调队列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。