[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大数)(平方切割,归并树,划分树)