考慮二分答案,把問題轉化成可行性問題,然後發現b+1 - c-1 是一定必選的,另外兩邊要想最大就是維護乙個連續最大子段和
然後每次二分值改變,只會影響線段樹上log個位置,於是考慮主席樹
#includeusingnamespace
std;
inline
intread()
while(ch<'
0'||ch>'9'
);
dowhile(ch>='
0'&&ch<='9'
);
return f*x;
}const
int maxn = 20000 + 5
;int
n;struct
num}a[maxn];
struct
p_tree
tree[maxn * 18
];int
cnt,root[maxn];
int q[4
];inline
void pushup(int
rt)inline
void build(int &rt,int l,int
r)
int mid = (l + r) >> 1
; build(tree[rt].lc,l,mid);
build(tree[rt].rc,mid+1
,r);
pushup(rt);
}inline
void insert(int &rt,int rt1,int l,int r,int
k)
int mid = (l + r) >> 1
;
if(mid >= k) tree[rt].lc = 0
,insert(tree[rt].lc,tree[rt1].lc,l,mid,k);
else tree[rt].rc = 0,insert(tree[rt].rc,tree[rt1].rc,mid+1
,r,k);
pushup(rt);
}inline
int query3(int rt,int l,int r,int l,int
r)inline
int query1(int rt,int l,int r,int l,int
r)inline
int query2(int rt,int l,int r,int l,int
r)inline
bool check(int
mid)
intmain()
lastans =a[ans].val;
printf(
"%d\n
",lastans);
}}
國家集訓隊 middle
傳送門 按照中位數題的套路,二分答案 mid 序列中 ge mid 記為 1 mid 的記為 1 然後只要存在乙個區間 l,r l in a,b r in c,d 的和 ge 0 則答案可以更大,否則就更小。所以說我們就要算出區間 b 1,c 1 的和,加上 a,b 的最大字尾,還有 c,d 最大字...
國家集訓隊 middle
首先,看到中位數就應該會想到乙個經典做法,二分乙個 mid 把小於 mid 的數值為 1 大於 mid 的數值為 1 如果這個區間的和 0 的話中位數可以更大,否則要更小 而題目中要求中位數最大,所以自然這個區間的和要越大越好,自然要多取 1 我們知道 b,c 這個區間是肯定會取到的,所以只要求和,...
國家集訓隊 middle
乙個長度為n的序列a,設其排過序之後為b,其中位數定義為b n 2 其中a,b從0開始標號,除法取下整。給你乙個長度為n的序列s。回答q個這樣的詢問 s的左端點在 a,b 之間,右端點在 c,d 之間的子串行中,最大的中位數。其中a位置也從0開始標號。第一行序列長度n。接下來n行按順序給出a中的數。...