小敏和小燕是一對好朋友。
他們正在玩一種神奇的遊戲,叫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 的中位數,...