對於每乙個詢問二分答案。
設當前答案為x,將》=x的數的權值設為1,當 [b+1,c-1]的權值和+[a,b]權值和最大的字尾+[c,d]權值和最大的字首》=0時x可行。
先對每個數離散,然後以每個值建立主席樹記錄區間和、最大字首、最大字尾就可以了。
時間複雜度:o(n*log3n)
**:
1 #include2 #include3 #include4 #include5 #include6bzoj2653using
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 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 ...