bzoj2653 二分 主席樹

2022-08-20 03:39:10 字數 1420 閱讀 7944

對於每乙個詢問二分答案。

設當前答案為x,將》=x的數的權值設為1,當 [b+1,c-1]的權值和+[a,b]權值和最大的字尾+[c,d]權值和最大的字首》=0時x可行。

先對每個數離散,然後以每個值建立主席樹記錄區間和、最大字首、最大字尾就可以了。

時間複雜度:o(n*log3n)

**:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define n 20010

8struct

nodec[n*80

];11

struct

lsb[n];

14 vectorg[n];

15int num,i,j,k,l,r,mid,n,m,rt[n],q,a[n],w[n],q[5

],ans;

16 inline int max(int x,int y)

17 inline bool cmp(ls a,ls b)

18 inline void up(int

x)23 inline void build(int& x,int l,int

r)29

int mid=l+r>>1;30

build(c[x].l,l,mid);

31 build(c[x].r,mid+1

,r);

32up(x);33}

34 inline void update(int& x,int y,int l,int r,int

z)42

int mid=l+r>>1;43

if(z<=mid)update(c[x].l,c[y].l,l,mid,z);else update(c[x].r,c[y].r,mid+1

,r,z);

44up(x);45}

46 inline int query_sum(int x,int l,int r,int l,int

r)54 inline int query_rx(int x,int l,int r,int l,int

r)61 inline int query_lx(int x,int l,int r,int l,int

r)68

intmain()

79 build(rt[1],1

,n);

80for(i=1;i)

85 scanf("

%d",&q);

86while(q--)

94 printf("

%d\n

",w[ans]);95}

96return0;

97 }

bzoj2653

bzoj2653 Middle 二分 主席樹

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

BZOJ 2653 middle 二分 主席樹

乙個長度為n的序列a,設其排過序之後為b,其中位數定義為b n 2 其中a,b從0開始標號,除法取下整。給你乙個 長度為n的序列s。回答q個這樣的詢問 s的左端點在 a,b 之間,右端點在 c,d 之間的子串行中,最大的中位數。第一行序列長度n。接下來n行按順序給出a中的數。接下來一行q。然後q行每...

BZOJ2653 middle 主席樹 二分

無法確定中位數 我們可以考慮轉化思路。二分乙個中位數,再判斷是否合理。根據本題中中位數的定義,只需要小於 它的 數的個數 l en2 le 2len 我們可以將大於i ii的數賦值成1 11,小於的賦值成 1 1 1。若ma xlsu m a,b 1 sum b,c ma xrsu m c 1,d ...