這個題很簡單√,但是我要講3種做法
我們維護乙個小根堆乙個大根堆,其中大根堆的堆頂小於小根堆的所有元素,待加入元素大於大根堆堆頂元素就加入小根堆,反之加入大根堆,然後維護兩個堆元素數量,使得兩個堆的元素數量差為1,這樣我們取兩個堆中元素多的那個的堆頂就是答案
初始化的時候先往大根堆裡加入乙個元素,避免**
堆的size()是unsigned int型別的,要強轉成int才能用abs
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n=
100010
;int n,m,ans;
priority_queue<
int,vector<
int>
>qmax;
priority_queue<
int,vector<
int>
,greater<
int>
>qmin;
inline
intread()
void
file()
void
add(
int x)
intquery()
else}if
(qmin.
size()
>qmax.
size()
)return qmin.
top();
else
return qmax.
top();
}int
main()
return0;
}
維護乙個值域樹狀陣列,所以我們需要離散化,我們每次加入乙個數a[i
]a[i]
a[i]
,查詢的時候取字首和為(i−
1)/2
(i-1)/2
(i−1)/
2的位置即為答案
#include
#include
#include
#include
#include
#include
#define lowbit(x) (x&-x)
using
namespace std;
const
int n=
100010
;int n,m,a[n]
,b[n]
,tree[n]
,cnt;
inline
intread()
void
file()
void
add(
int x)
intfind
(int x)
return ans+1;
}int
main()
sort
(b+1
,b+n+1)
; cnt=
unique
(b+1
,b+n+1)
-b-1
;for
(int i=
1;i<=n;i++
)add
(a[1])
;printf
("%d\n"
,b[find(1
)]);
for(
int i=
2;i<=n+
1>>
1;i++
)return0;
}
最最簡單的做法,我們每次找到第乙個比要插入的數大的數,在它前面插入,查詢非常簡單了,不贅述qwq
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n=
100010
;int n,m;
vector<
int>a;
inline
intread()
void
file()
intmain()
return0;
}
洛谷 P1168 中位數
題目描述 給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 2 a 2k 1 的中位數。color red 即 color 前1,3,5,個數的中位數。輸入輸出格式 輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a ...
洛谷 P1168 中位數
給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 3 a 2k 1 的中位數。color red 即 color 前1,3,5,個數的中位數。輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a i a i 10 9 輸...
洛谷P1168中位數
傳送門啦 基本思想就是二分尋找答案,然後用樹狀陣列去維護有幾個比這個二分出來的值大,然後就沒有了 資料要離散,這個好像用map也可以,但是不會 那怎麼離散呢?我們先把a陣列讀入並複製給s陣列,然後排序a 這個時候a陣列就有序了,我們就可以把s陣列裡的值通過二分找到其在a陣列裡的下標,這樣就把1 1e...