luogu 1969 積木大賽

2022-05-11 16:59:41 字數 2142 閱讀 1366

初始序列為全\(0\),可以對序列進行的操作為將\([l,r]\)整體\(+1\),問操作多少次後可以得到序列\(a\).

顯然,最優的策略即是先找到整個序列的最小值,整體加上這麼多,於是序列分成了兩塊;找到左半邊的最小值,左半邊整體加上;找到右半邊的最小值,右半邊整體加上……然而這樣的做法是\(o(n^2)\)的,怎麼辦呢?

用線段樹維護區間最小值,區間修改+區間查詢。

複雜度\(o(nlogn)\).

#include #define lson (rt << 1)

#define rson (rt << 1 | 1)

#define inf 0x3f3f3f3f

#define maxn 100010

using namespace std;

typedef long long ll;

struct node tr[maxn * 4];

void push_up(int rt)

void build(int rt, int l, int r)

int mid = l + r >> 1;

build(lson, l, mid); build(rson, mid+1, r);

push_up(rt);

}void push_down(int rt)

}void modify(int rt, int l, int r, int del)

push_down(rt);

int mid = tr[rt].l + tr[rt].r >> 1;

if (r <= mid) modify(lson, l, r, del);

else if (l > mid) modify(rson, l, r, del);

else modify(lson, l, mid, del), modify(rson, mid+1, r, del);

push_up(rt);

}int query(int rt, int l, int r, int& p)

push_down(rt);

int mid = tr[rt].l + tr[rt].r >> 1;

if (r <= mid) return query(lson, l, r, p);

else if (l > mid) return query(rson, l, r, p);

else

else

}}int solve(int l, int r)

}int main()

考慮第\(i\)塊積木和第\(i+1\)塊積木,如果第\(i+1\)塊的積木低於或等於第\(i\)塊積木的高度,那麼在搭第\(i\)塊積木的時候或者在這之前肯定就已經順便搭好了第\(i+1\)塊積木;而如果第\(i+1\)塊的積木高於第\(i\)塊積木的高度,那麼第\(i+1\)塊積木就必須要自己彌補上空缺的部分。

其實這個想法的具體操作完全等價於之前的思路,只不過是將每次找最小值的過程歸到了從前往後的計算中,因此,在後一塊積木的高度低於前一塊積木的高度時無需再進行計算,因為已經在前面被計算過了。

#include using namespace std;

typedef long long ll;

int main()

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

return 0;

}

將左半邊與右半邊合併時,如果\(h[mid]\geq h[mid+1]\),則第\(mid+1\)塊及之後被截斷之前的若干塊的\(h[mid+1]\)的部分都在搭第\(mid\)塊時完成了;如果\(h[mid]\lt h[mid+1]\),則第\(mid+1\)塊及之後被截斷之前的若干塊的\(h[mid]\)的部分也都在搭第\(mid\)塊時完成了。

solve(l,r)=solve(l,mid)+solve(mid+1,r)-min(h[mid],h[mid+1]);

#include #define maxn 100010

using namespace std;

typedef long long ll;

int a[maxn];

int solve(int l, int r)

int main()

luogu1969 積木大賽

搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。在搭建開始之前,沒有任何積木 可以看成n塊高度為 0 的積木 接下來每次操作,可以選擇一段連續區間 l,r 然後將第 l 塊到第 r 塊之間 含第 l 塊和第 r 塊 所有積木的高度分別增加1。求操作的最小...

P1969 積木大賽

春春幼兒園舉辦了一年一度的 積木大賽 今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。在搭建開始之前,沒有任何積木 可以看成n塊高度為 0 的積木 接下來每次操作,小朋友們可以選擇一段連續區間 l,r 然後將第第 l 塊到第 r 塊之間 ...

P1969 積木大賽

題目描述 春春幼兒園舉辦了一年一度的 積木大賽 今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi 在搭建開始之前,沒有任何積木 可以看成n塊高度為0的積木 接下來每次操作,小朋友們可以選擇一段連續區間 l,r 然後將第第l塊到第 r 塊之間...