1. 程式人生 > >poj2104 K-th Number

poj2104 K-th Number

per scanf algo using clas urn space n) mat

思路:

平方分割。

實現:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <vector>
 4 #include <cmath>
 5 using namespace std;
 6 const int MAXN = 100005;
 7 const int B = 1000;
 8 int n, m, a[MAXN], nums[MAXN];
 9 vector<int> v[MAXN / B];
10 bool check(int x, int l, int r, int k)
11 { 12 int ans = 0; 13 while (l < r && l % B) if (a[l++] <= nums[x]) ans++; 14 while (r > l && r % B) if (a[--r] <= nums[x]) ans++; 15 for (int i = l / B; i < r / B; i++) 16 { 17 ans += upper_bound(v[i].begin(), v[i].end(), nums[x]) - v[i].begin();
18 } 19 return ans >= k; 20 } 21 int main() 22 { 23 scanf("%d %d", &n, &m); 24 for (int i = 0; i < n; i++) 25 { 26 scanf("%d", &a[i]); 27 nums[i] = a[i]; 28 v[i / B].push_back(a[i]); 29 } 30 for (int i = 0; i <= n / B; i++) sort(v[i].begin(), v[i].end());
31 sort(nums, nums + n); 32 int x, y, k; 33 for (int i = 0; i < m; i++) 34 { 35 scanf("%d %d %d", &x, &y, &k); 36 x--; 37 int l = 0, r = n - 1, ans = -1; 38 while (l <= r) 39 { 40 int m = l + r >> 1; 41 if (check(m, x, y, k)) { r = m - 1; ans = m; } 42 else l = m + 1; 43 } 44 printf("%d\n", nums[ans]); 45 } 46 return 0; 47 }

poj2104 K-th Number