二分答案+++++++(。・ω・。) 感覺這個思路好像挺常用的:求第\(k\) 大 --> 二分第 \(k\) 大的值 --> 檢驗當前二分的值排名是第幾。前提:排名與數值大小成單調性變化。於是對於這題我們也不例外,二分一下最後中位數的值是多少,把陣列中的值 \(> k\) 的變成 \(1\),\(< k\) 的變成 \(-1\), \(= k\) 的為 \(0\)。那麼,乙個中位數為 \(k\) 的區間區間和為 \(0\), 乙個中位數\(< k\) 的區間和 \(< 0\), \(> k\) 則 \(> 0\)。
於是求區間中位數 \(> k\) 和 \(=k\) 的區間就轉化為了求滿足條件的區間值的區間。這個只需要用樹狀陣列維護一下就好啦。由於有奇數的規定,我們開兩個樹狀陣列分別代表偶數下標和奇數下標,以保證求得的區間長度為奇數。以及因為有負數,所以將陣列整體向後平移即可。
#includeusingnamespace
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...