計蒜客 微軟大樓設計方案(RMQ)

2022-05-28 05:09:09 字數 2551 閱讀 9722

題目鏈結 微軟大樓設計方案

中文題就不說題意了~

首先是簡單版本

滿足$1 <= n, m <= 50$

那麼設$c[i][j]$為從第$i$幢樓到第$j$幢樓的最低的那幢樓的高度

計算兩個點之間的距離的時候,若兩個點分別在第$i$列,第$j$列,那麼要根據$c[i][j]$來計算。

暴力即可

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

int n, k;

int a[10010];

int c[201][201];

int x[201], y[201];

int m;

int ans = 0;

int main()

rep(i, 1, n) rep(j, 1, n) if (c[i][j] == 0) c[i][j] = c[j][i];

scanf("%d", &m);

rep(i, 1, m) scanf("%d%d", x + i, y + i);

rep(i, 1, m - 1)

} printf("%d\n", ans);

return 0;

}

再是中等版本

滿足$1 <= n <= 200000, 1 <= m <= 2000$

$m$的範圍讓我們還是可以在1秒鐘之內兩兩枚舉點對並完成統計

就是$c[i][j]$不能按照剛剛那個方法求了。

我們構建一張st表,令$f[i][j]$為從$i$開始連續$2^$個數的最小值

於是在$o(1)$內我們可以得到第$i$幢樓到第$j$幢樓的最低的那幢樓的高度

中等版本也解決了

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

int a[200030];

int f[200030][22];

int n, m, k;

int ans = 0;

struct node

friend bool operator < (const node &a, const node &b)

} p[3010];

inline int solve(int l, int r)

void work()

int main()

} printf("%d\n", ans);

return 0;

}

最後是困難版本

滿足$1 <= n <= 200000, 1 <= m <= 200000$

這個時候不能兩兩枚舉點對來統計了

注意到$h[i] <= 20$,這是乙個很重要的條件

對於當前在第$i$列的某個點,我們發現在他之後的$max(0, k - 40)$列中的所有點

這些點不用考慮,一定符合

條件因位距離最大值為$ k - 40 + max(h[i]) + max(h[j]) <= k$,所以一定符合條件

同理我們也發現,第$i + k$之後的點肯定不符合條件

那麼我們只要列舉$i + max(0, k - 40) + 1$ 到 $i + k$

這些列中的所有點就可以了

做的時候維護乙個字首和即可。

時間複雜度$o(mlogm + mh^)$

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

const int n = 200100;

int a[n];

int f[n][22];

int n, m, k;

long long ans = 0;

long long c[n];

int g[n][22];

vector v[n];

struct node

friend bool operator < (const node &a, const node &b)

} p[n];

inline int solve(int l, int r)

void work()

int main()

rep(i, 1, m)

int now = p[i].x + k;

if (now > n) now = n;

rep(j, max(cnt + 1, p[i].x + 1), now)

} }printf("%lld\n", ans);

return 0;

}

計蒜課 微軟大樓設計方案 中等 xjb

題意 中文題誒 思路 對於座標為p1 x1,y1 p2 x2,y2 的兩個核心,其中 x1 x2 用 d p1,p2 表示兩者間最矮的大樓,則需要時間為 對於d p1,p2 min y1,y2 情況,cnt abs x2 x1 abs y2 y1 對於d p1,p2 min y1,y2 情況,cnt...

微軟大樓設計方案(中等) 推公式 RMQ問題

近日,微軟新大樓的設計方案正在廣泛徵集中,其中一種方案格外引人注目。在這個方案中,大樓由 nn 棟樓組成,這些樓從左至右連成一排,編號依次為 11 到 nn,其中第 ii 棟樓有 h ih i 層。每棟樓的每一層為乙個獨立的 辦公區域,可以步行 直達同層相鄰樓棟的辦公區域,以及 直達同樓棟相鄰樓層的...

計蒜客 青雲的機房組網方案

含n 10w 個結點的樹。邊權為 1 點權ai 1,10w 求點權互質的點之間的距離之和。include include include include define rep x,st,en for int x st x en x pragma comment linker,stack 102400...