码迷,mamicode.com
首页 > 其他好文 > 详细

poj2104 K-th Number

时间:2018-02-18 21:30:59      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:ons   ret   for   max   cst   poj2104   scanf   printf   str   

思路:

平方分割。

实现:

 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

标签:ons   ret   for   max   cst   poj2104   scanf   printf   str   

原文地址:https://www.cnblogs.com/wangyiming/p/8453190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!