首页 > 代码库 > POJ 2104 K-th Number

POJ 2104 K-th Number

题意是说给出n个数。

然后给出一个查询(left,right, k) 给在left 和right 之间的数排序之后 输出第k大的数。

技术分享高级数据结构搞我完全不会啊。

连线段树怎么做这道题都没有思路。


只想到了一个排序然后找的办法,只要数据卡一下就过不了。。。

以后学了其他方法一定要回来搞。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define FOR_(i,a,b) for(int i=a;i>=b;i--)
#define sf scanf
#define pf printf
#define all(v) (v).begin(),(v).end()
#define acfun std::ios::sync_with_stdio(false)

#define SIZE (100000  +1)
#define MOD 1000000007
using namespace std;
struct node
{
    int pos,val;
    bool friend operator <(node a,node b)
    {
        return a.val<b.val;
    }
}arr[SIZE];
int main()
{
    int n,m;
    while(~sf("%d%d",&n,&m))
    {
        FOR(i,0,n)
        {
            sf("%d",&arr[i].val);
            arr[i].pos=i+1;
        }
        sort(arr,arr+n);
        while(m--)
        {
            int l,r,k;
            sf("%d%d%d",&l,&r,&k);
            int tmp=0;
            int pos=-1;
            FOR(i,0,n)
            {
                if(l<=arr[i].pos&&r>=arr[i].pos)
                    tmp++;
                if(tmp==k)
                {
                    pos=i;
                    break;
                }
            }
            pf("%d\n",arr[pos].val);
        }
    }
}


POJ 2104 K-th Number