[POJ2104]K-th Number(区间第k值 记录初始状态)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POJ2104]K-th Number(区间第k值 记录初始状态)相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=2104

给n个数和m个查询,查询[i, j]内第k小的数是多少。(主席树、划分树那种高大上的姿势叒不会啊QAQ

可以在维护这n个数的同时维护刚刚输入的时候他们的下标,之后预处理排序一次,查询的时候假如初始下标在[i,j]内,那么k自减1,直到k为0。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 typedef struct Node {
23     int id;
24     int x;
25     Node() {}
26     Node(int ii, int xx) : id(ii), x(xx) {}
27 }Node;
28 
29 const int maxn = 111111;
30 int n, m;
31 Node a[maxn];
32 
33 bool cmp(Node x, Node y) {
34     return x.x < y.x;
35 }
36 
37 int main() {
38     // freopen("in", "r", stdin);
39     int tmp;
40     while(~scanf("%d %d", &n, &m)) {
41         for(int i = 0; i < n; i++) {
42             scanf("%d", &tmp);
43             a[i] = Node(i+1, tmp);
44         }
45         sort(a, a+n, cmp);
46         while(m--) {
47             int i, j, k, ans = 0;
48             scanf("%d %d %d", &i, &j, &k);
49             for(int s = 0; s < n; s++) {
50                 if(a[s].id >= i && a[s].id <= j) k--;
51                 if(k == 0) {
52                     printf("%d\n", a[s].x);
53                     break;
54                 }
55             }
56         }
57     }
58     return 0; 
59 }

 

以上是关于[POJ2104]K-th Number(区间第k值 记录初始状态)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

[POJ 2104]K-th Number模板(主席树)

POJ2104 K-th Number(线段树,二分,vector)

poj2104 K-th Number 主席树入门;

POJ-2104 K-th Number CDQ分治

POJ2104:K-th Number——题解