題意:給乙個陣列a,每次詢問,給定l, r, p, k,求[ l , r ] 中的數與p做差的絕對值的第k小。
思路:對陣列a建立主席樹(不用離散化),對於每次詢問,二分答案,如果 [ l , r ] 區間中的 [ p - mid , p + mid ] 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間;如果等於k,也需要縮小,因為要找到精確的值;小於k則需要放大區間。(可以畫數軸理解)
**:
1 #include2using
namespace
std;
3const
int maxn=1e5+10;4
const
int n=1e6;
5struct
nodetree[maxn*22];8
introot[n];
9int
tot;
10int
n,m;
11void update(int &p,int x,int l,int r,int
rt)20
int query(int u,int v,int x,int y,int l,int
r)24
int ans=0;25
int mid=(l+r)>>1;26
if(x<=mid) ans+=query(tree[u].l,tree[v].l,x,y,l,mid);
27if(y>mid) ans+=query(tree[u].r,tree[v].r,x,y,mid+1
,r);
28return
ans;29}
30int solve(int l,int r,int x,int
y)35
intmain()
3647
int ans=0;48
for(int i=1;i<=m;i++)
59 ans=l;
60 printf("
%d\n
",ans);61}
62}63return0;
64 }
HDU 6621 主席樹 二分優化
這本來應該是多校的時候用來救命的一道資料結構水題,結果當時不知道是測評機有問題還是我 不夠簡單,15s都tle了,當時很慌,也沒細想,後來重寫了一遍,6s不到過了。題意很好理解,乙個陣列,我問你某一子區間內所有數和p pp的差值裡,第k kk小的是多少?首先,這題主席樹基本不難想,要是不會主席樹可以...
hdu 6621(主席樹模板)
hdu 6621 思路 每次查詢第k小,只有p在改變,所以我們可以列舉p的左右範圍,因為題目中保證每個值都不同,所以省略離散化,直接建立主席樹,二分尋找p的左右範圍,就是最終的答案。include using namespace std const int maxn 1e6 10 int a max...
bzoj2653 二分 主席樹
對於每乙個詢問二分答案。設當前答案為x,將 x的數的權值設為1,當 b 1,c 1 的權值和 a,b 權值和最大的字尾 c,d 權值和最大的字首 0時x可行。先對每個數離散,然後以每個值建立主席樹記錄區間和 最大字首 最大字尾就可以了。時間複雜度 o n log3n 1 include2 inclu...