BZOJ4268 小強的書架

2021-09-07 02:33:47 字數 1944 閱讀 6201

首先將所有高度乘上10,設f[i]為將前i本書放入書架的最小高度,則

\[\begin

f[i]&=&\min(f[j-1]+first(j,i)+second(j,i)+w-(s[i]-s[j-1]))\\

&=&\min(f[j-1]+first(j,i)+second(j,i)+w-s[i]+s[j-1])\\

&=&\min(f[j-1]+first(j,i)+second(j,i)+s[j-1])+w-s[i]

\end\]

其中$1\leq j\leq i$且$s[i]-s[j-1]\leq w$。

設tmp[i][j]=f[j-1]+s[j-1]+first(j,i)+second(j,i),考慮用線段樹維護tmp[i][j],如果當前要計算f[i],那麼線段樹的第j個葉子節點就表示tmp[i][j]。

為了高效維護first和second,先將所有書按高度排序,從大到小插入到set中。

假設現在插入的是第x本書,那麼對於[pre(x)+1,x]內的i,first(i,x)均為a[x]。

對於[pre(pre(x))+1,pre(x)]內的i,以及[x,nxt(x)-1]內的j,second(i,j)均為a[x]。

對於[pre(x)+1,x]內的i,以及[nxt(x),nxt(nxt(x))-1]內的j,second(i,j)也均為a[x]。

於是在右端點的最小值處進行區間賦值操作即可。

時間複雜度$o(n\log n)$。

#include#include#include#define n 300010

using namespace std;

typedef long long ll;

int n,w,i,j,k,c[n],l[n],g[n],vl[n<<1],vr[n<<1],nxt[n<<1],ed;ll a[n],b[n],vw[n<<1],f;

sett;set::iterator it;

inline bool cmp(int x,int y)

inline void add(int x,int l,int r,ll w)

struct nodes[1050000];

inline void tag1(int x,ll p)

inline void tag2(int x,ll p)

inline void pb(int x)

if(s[x].t2)

}inline void up(int x)

void same1(int x,int a,int b,int c,int d,ll p)

pb(x);

int mid=(a+b)>>1;

if(c<=mid)same1(x<<1,a,mid,c,d,p);

if(d>mid)same1(x<<1|1,mid+1,b,c,d,p);

up(x);

}void same2(int x,int a,int b,int c,int d,ll p)

pb(x);

int mid=(a+b)>>1;

if(c<=mid)same2(x<<1,a,mid,c,d,p);

if(d>mid)same2(x<<1|1,mid+1,b,c,d,p);

up(x);

}void change(int x,int a,int b,int c,ll p)

pb(x);

int mid=(a+b)>>1;

c<=mid?change(x<<1,a,mid,c,p):change(x<<1|1,mid+1,b,c,p);

up(x);

}ll ask(int x,int a,int b,int c,int d)

int main()

for(i=j=1;i<=n;i++)

return printf("%lld.%d",f/10,f%10),0;

}

BZOJ2837 小強的形狀

離散化後通過樹狀陣列求出 b i 為i之前比它小的。c i 為i之前比它大的 i 1 i之前小於等於它的。d i 為i之後比它小的。e i 為i之後比它大的 n i f i f i 為i之後小於等於它的。則 cnt sum n b i e i cnt sum n c i d i cnt 將序列a翻轉...

BZOJ 5125 小Q的書架

小 q 有 n 本書,每本書有乙個獨一無二的編號,現在它們正零亂地在地上排成了一排。小 q 希望把這一排書分成恰好 k 段,使得每段至少有一本書,然後把每段按照現在的順序依次放到 k 層書架的每一層上去。將所有書都放到書架上後,小 q 這才突然意識到它們是亂序的,他只好把每一層的書分別按照編號從小到...

BZOJ1926 粟粟的書架(主席樹,字首和)

第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來m行,第i行給出正整數x1i,y1i,x2i,y2i,hi,表示第i天的指定區域是 x1i,y1i 與 x2i,y2i 間 的矩形,總頁數之和要求不低於hi。保證1 x1i x2i r,...