題解 51nod 1685第K大區間2

2022-02-27 11:43:29 字數 1099 閱讀 2336

二分答案+++++++(。・ω・。) 感覺這個思路好像挺常用的:求第\(k\) 大 --> 二分第 \(k\) 大的值 --> 檢驗當前二分的值排名是第幾。前提:排名與數值大小成單調性變化。於是對於這題我們也不例外,二分一下最後中位數的值是多少,把陣列中的值 \(> k\) 的變成 \(1\),\(< k\) 的變成 \(-1\), \(= k\) 的為 \(0\)。那麼,乙個中位數為 \(k\) 的區間區間和為 \(0\), 乙個中位數\(< k\) 的區間和 \(< 0\), \(> k\) 則 \(> 0\)。

於是求區間中位數 \(> k\) 和 \(=k\) 的區間就轉化為了求滿足條件的區間值的區間。這個只需要用樹狀陣列維護一下就好啦。由於有奇數的規定,我們開兩個樹狀陣列分別代表偶數下標和奇數下標,以保證求得的區間長度為奇數。以及因為有負數,所以將陣列整體向後平移即可。

#includeusing

namespace

std;

#define maxn 350000

#define inf int_max

#define lowbit(i) (i & (-i))

intn, k, ans, a[maxn], a[maxn], sum[maxn];

int c[2][maxn], b[maxn], d =1e5;

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void update(int x, int

opt)

int query(int x, int

opt)

int check(int

mid)

if(k > ans1 + ans2) return1;

else

if(k < ans2) return2;

else

return0;

}int

main()

}printf(

"%d\n

", ans);

return0;

}

51nod1685 第K大區間2

1685 第k大區間2 基準時間限制 1.5 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 現給出n個數,求將所有長度為奇數的區間的值排序後,第k大的值為多少。樣例解釋 l,r 表示區間的值 1 3 2 1 3 2 4 4 1,3 2 2,4 2 第三大是2 input 第一行...

51Nod 1686 第K大區間

題意 中文題,定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。離散化二分答案加尺取判斷 include include includeusing namespace std const int maxn 100006 typedef long long l...

51nod 1686 第K大區間

1686 第k大區間 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2...