入门难度。。
没错,但是我并不是要暴力做。
而是用树状数组来做。
先离散化,然后随便搞一搞就可以了。(晕。比暴力还慢)
如果要查找某一区间的的话可以把区间取出重新建树,然后再求。(更暴力)
1 #include <cstdio> 2 #include <vector> 3 #include <algorithm> 4 #define N 10001 5 #define lowbit(x) x & -x 6 7 using namespace std; 8 9 int n, m, k; 10 int c[N]; 11 bool b[3 * N]; 12 struct node 13 { 14 int val, id; 15 }a[N]; 16 17 inline bool cmp(node x, node y) 18 { 19 return x.val < y.val; 20 } 21 22 inline void add(int x) 23 { 24 while(x <= m) 25 { 26 c[x]++; 27 x += lowbit(x); 28 } 29 } 30 31 int solve(int k) 32 { 33 int i, cnt = 0, ans = 0; 34 for(i = 20; i >= 0; i--) 35 { 36 ans += 1 << i; 37 if(ans >= m || cnt + c[ans] >= k) ans -= 1 << i; 38 else cnt += c[ans]; 39 } 40 return ans + 1; 41 } 42 43 int main() 44 { 45 int i, x; 46 scanf("%d %d", &n, &k); 47 for(i = 1; i <= n; i++) 48 { 49 scanf("%d", &x); 50 if(!b[x]) b[x] = 1, a[++m].val = x, a[m].id = m; 51 } 52 if(m < k) 53 { 54 printf("NO RESULT"); 55 return 0; 56 } 57 sort(a + 1, a + m + 1, cmp); 58 for(i = 1; i <= m; i++) add(a[i].id); 59 printf("%d ", a[solve(k)].val); 60 return 0; 61 }