題意:
乙個長度為n的序列(每個元素是(a
i,bi
) 這樣的數對),連續地分成若干組。每組左右邊界是(l
1,r1
) ,(l
2,r2
) ,⋯,(l
p,rp
) ,滿足li
=ri−
1+1 ,li
≤ri ,l1
=1,rp=
n 。分組必須滿足兩個條件:前面組的元素的b值比後面組元素的a值大;令mi
為第i個組內最大的a,所有mi
的和不超過li
mit 。令si為第i個組的元素的b的和,最小化ma
xsi 。
題解:
二分答案。
能否破除b和a的關係呢?
考慮什麼情況下必須**在一起。 如果a
i>bj
,那麼任意bk
≤bj ,都必須與ai
**在一起,否則不符合題意。
所以考慮排序bj
,然後從大到小掃。
然後剩下的就沒有限制了,於是問題就變成,給出乙個數列,(每個組a的最大值)的和不能超過limit,(各組內b的的和)的最大值最小。
然後乙個單調佇列優化dp,具體細節看**。
想交oj的話可以看這個spoj.com - problem seqpar2
然後lcy大神用線段樹,我跑了8.72s,而ta卻只要4s,線段樹題解看ta的吧:
題解:
這個題目有兩種做法,一種直接用斜率優化,另一種在斜率優化的基礎上進行點分治優化。
然後這個題目在noi2014上被加強了為購票,題目和做法差不多,可以參見這個題目的做法。
原題apio 2010特別行動隊
斜率優化經典題
**:
#include
#include
#include
#include
#include
#include
#define f(i,j,n) for(int i=j;i<=n;i++)
#define d(i,j,n) for(int i=j;i>=n;i--)
typedef
long
long ll;
const
int maxn = 100000+10;
using
namespace
std;
int n,l,r;
ll a,b,c,q[maxn],f[maxn],s[maxn];
inline
int read()
while (ch>='0'&&ch<='9')
return x*f;
}inline
double getk(int x,int y)
int main()
動態規劃測試3 test20170406
炸彈bombpasccpp time1s memory256m 戰爭warpasccpp time1s memory256m總結 突然就考試,做完1,2題就開始浪了。於是就第三題打了個暴力 用emacs之後 縮排似乎就呵呵了 高老大有乙個n n 的廣場,被均分成n n 個格仔。其中某些格仔種上了樹。...
動態規劃(2) 01揹包
給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...
動態規劃(2) 01揹包
給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...