初始序列為全\(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 塊之間...