BSOJ3401 建築 主席樹 二分

2021-09-06 08:25:09 字數 2823 閱讀 6332

小敏和小燕是一對好朋友。

他們正在玩一種神奇的遊戲,叫minecraft。

他們正在蓋建築,他們手上有不同的方塊。

每種方塊有不同的不美觀度,他們持有每種方塊的數量也不一樣。

他們現在準備實行他們眾多建築計畫中的乙個。

他們的建築計畫有不同的要求,不美觀度有上限和下限。為了方便拿取方塊,他們也要求所用的方塊在方塊堆中的連續一段。每個建築計畫需要固定的方塊數。

他們現在要知道,在最好情況下,每個建築計畫中最不美觀的方塊的不美觀度是多少。

輸入格式

第一行乙個整數n,表示方塊種類數。

接下來的n 行,第i+1 行有兩個整數,pi和qi,分別表示在方塊堆中的第i種方塊的不美觀度和數量。

接下來的一行乙個整數m,表示建築計畫的數量。

接下來的m 行,每行五個整數l,r,s,t,k,分別代表該建築計畫的中所用的方塊種類要在方塊堆的[l,r]區間中,並且美觀度要介於[s,t]中,且需要k 個方塊。

輸出格式

對於每個建築計畫,輸出一行乙個整數,表示該建築計畫最好情況下最不美觀度的方塊的不美觀度。如果沒有滿足條件的建築方案,輸出-1。

資料範圍

對於30%的資料,n<=10,m<=30

對於40%的資料,n<=100,m<=300

對於60%的資料,n<=1000,m<=3000

對於100%的資料,n<=30000,m<=30000

要求最不美觀度最小,可以考慮二分答案。設當前二分到的答案為mid

midmi

d,則問題轉化為判定是否在制指定區間內存在k

kk個方塊,且不美觀度在l

ll到mid

midmi

d之間,若存在,則令r=m

id

r=mid

r=mi

d,否則令l=m

id+1

l=mid+1

l=mid+

1,繼續進行上述二分。最後的答案為lll。

現在的問題是如何求區間內小於等於指定數的個數。可以用主席樹,即可持久化線段樹,以權值為下標對每個值建立由前乙個值轉移過來的線段樹。利用字首和思想,可以求得在指定區間內小於等於指定數的個數。具體看**。

由於是按照權值建立的主席樹,所以要先離散化。

#include

#include

#include

#include

using

namespace std;

const

int n=

30005

,logn=20;

int n,m,rt[n]

,s[n*logn]

,nn,l[n*logn]

,ans;

int val[n]

,num[n]

,tot,r[n*logn]

;//s存在當前值域的數的個數

int b[n*3]

,qs[n]

,qt[n]

,ql[n]

,qr[n]

,qk[n]

;void

build

(int

&p,int l,

int r)

void

insert

(int

&p,int rt,

int l,

int r,

int v,

int x)

void

ask(

int p,

int q,

int l,

int r,

int ql,

int qr)

int mid=

(l+r)

>>1;

if(ql<=mid)

ask(l[p]

,l[q]

,l,mid,ql,qr);if

(qr>mid)

ask(r[p]

,r[q]

,mid+

1,r,ql,qr);}

intmain()

nn=n;

scanf

("%d"

,&m)

;for

(int i=

1;i<=m;i++

)sort

(b+1

,b+nn+1)

;//離散化

nn=unique

(b+1

,b+nn+1)

-b-1

;for

(int i=

1;i<=n;i++

) val[i]

=lower_bound

(b+1

,b+nn+

1,val[i]

)-b;

build

(rt[0]

,1,n);

for(

int i=

1;i<=n;i++

)//乙個個在值域中插入數量

insert

(rt[i]

,rt[i-1]

,1,nn,val[i]

,num[i]);

for(

int i=

1;i<=m;i++)if

(l>qr[i]

)puts

("-1");

//無解

else

printf

("%d\n"

,b[l]);

//輸出離散化後對應的值

}return0;

}

hdu 6621 主席樹 二分

題意 給乙個陣列a,每次詢問,給定l,r,p,k,求 l r 中的數與p做差的絕對值的第k小。思路 對陣列a建立主席樹 不用離散化 對於每次詢問,二分答案,如果 l r 區間中的 p mid p mid 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間 如果等於k,也需要縮小,因為要找到精確的值...

bzoj2653 二分 主席樹

對於每乙個詢問二分答案。設當前答案為x,將 x的數的權值設為1,當 b 1,c 1 的權值和 a,b 權值和最大的字尾 c,d 權值和最大的字首 0時x可行。先對每個數離散,然後以每個值建立主席樹記錄區間和 最大字首 最大字尾就可以了。時間複雜度 o n log3n 1 include2 inclu...

bzoj2653 Middle 二分 主席樹

這題厲害啊。根本想不到。據說是clj的題?首先要想到二分答案,想到就解出一半了。假設有乙個值x,如果x是區間 l,r 的中位數,且l a,b r c,d 那麼答案一定 x 否則答案一定 那麼如何判斷x是否是 l,r 的中位數呢?實際上,如果使用二分的話,我們不需要知道x是否一定是 l,r 的中位數,...