題目鏈結 微軟大樓設計方案
中文題就不說題意了~
首先是簡單版本
滿足$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...