1. 程式人生 > >[ACM][2018南京預賽]Lpl and Energy-saving Lamps

[ACM][2018南京預賽]Lpl and Energy-saving Lamps

oid 其他 所有 技術 width 當前 urn return 代碼

一、題面

技術分享圖片

技術分享圖片

技術分享圖片

樣例輸入:

5 4
3 10 5 2 7
10
5 1 4 8 7 2 3 6 4 7

樣例輸出:

4 0
1 1
3 6
5 1
5 1
2 0
3 2
4 4
3 6
5 1

二、思路

關鍵詞:線段樹

這道題最難就難在看題吧。。。也許ACM的魅力之一便在於此——面對若幹道題,你不知每一道題的難度是高是低,只能耐心地讀清題面,審清題意,理清思路,方可知其是否在能力範圍內以及預估耗時。考試過程中,我基本靠board來判斷題目難度,清北大佬們先AC了哪些我就先做哪些。。。然而這道題似乎他們也不太願意讀題?其實際難度我覺得可能還要低於其他幾道更早被A的題目。

題目大意是:現每個月提供m個燈泡,每次選出第一個小於當前燈泡數的房間,更換好該房間的燈泡,直至不存在這樣的房間,則進入下個月。給出若幹次月份數,求這幾個月內能更換多少個房間的燈泡,以及剩余燈泡數。註意:當所有房間更換完之後,將不再提供燈泡!

n <= 10 ^ 5, d[p] <= 10 ^ 5,暴搜不可行。題目核心無非是求最早出現的小於k的數,可以用線段樹維護每一段的最小值,再進行單點修改。水的一批。

三、代碼

 1 #include <cstdio>
 2 #define MAXN 100005
 3 #define INF 0x3f3f3f3f
 4 
 5 int n, m, T, a[MAXN], x, t[MAXN << 2], k, l[MAXN], r[MAXN], q, mx, tot;
 6 
 7 int max(int a, int b) {
 8     return a > b ? a : b;
9 } 10 11 int min(int a, int b) { 12 return a < b ? a : b; 13 } 14 15 void build(int o, int l, int r) { 16 if (l == r) { 17 scanf("%d", &x), t[o] = x; 18 return; 19 } 20 int m = (l + r) >> 1; 21 build(o << 1, l, m), build(o << 1 | 1, m + 1
, r); 22 t[o] = min(t[o << 1], t[o << 1 | 1]); 23 } 24 25 int query(int o, int l, int r) { 26 if (l == r) return l; 27 int m = (l + r) >> 1; 28 if (t[o] > k) return 0; 29 return t[o << 1] <= k ? query(o << 1, l, m) : query(o << 1 | 1, m + 1, r); 30 } 31 32 void upd(int o, int l, int r) { 33 if (l == r) { 34 k -= t[o], t[o] = INF; 35 return; 36 } 37 int m = (l + r) >> 1; 38 if (q <= m) upd(o << 1, l, m); 39 else upd(o << 1 | 1, m + 1, r); 40 t[o] = min(t[o << 1], t[o << 1 | 1]); 41 } 42 43 void work() { 44 for (int i = 1; i <= mx; i++) { 45 if (tot != n) { 46 k += m; 47 while (q = query(1, 1, n)) upd(1, 1, n), tot++; 48 } 49 l[i] = k, r[i] = tot; 50 } 51 } 52 53 int main() { 54 scanf("%d %d", &n, &m); 55 build(1, 1, n); 56 scanf("%d", &T); 57 for (int i = 1; i <= T; i++) scanf("%d", &a[i]), mx = max(a[i], mx); 58 work(); 59 for (int i = 1; i <= T; i++) printf("%d %d\n", r[a[i]], l[a[i]]); 60 return 0; 61 }

[ACM][2018南京預賽]Lpl and Energy-saving Lamps