• HDU --2665


    Kth number

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4349    Accepted Submission(s): 1381


    Problem Description
    Give you a sequence and ask you the kth big number of a inteval.
     
    Input
    The first line is the number of the test cases. 
    For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere. 
    The second line contains n integers, describe the sequence. 
    Each of following m lines contains three integers s, t, k. 
    [s, t] indicates the interval and k indicates the kth big number in interval [s, t]
     
    Output
    For each test case, output m lines. Each line contains the kth big number.
     
    Sample Input
    1 10 1 1 4 2 3 5 6 7 8 9 0 1 3 2
     
    Sample Output
    2

     AC代码:

      1 #include<iostream>
      2 #include<algorithm>
      3 #include<cstdio>
      4 #define MAX 100005
      5 using namespace std;
      6 class TreeNode
      7 {
      8     public:
      9         int left, right, mid;
     10 };
     11 TreeNode node[4*MAX];
     12 int val[30][MAX];
     13 int ToLeft[30][MAX];
     14 int sorted[MAX];
     15 void BuildTree(int k, int d, int l, int r)
     16 {
     17     node[k].left = l;
     18     node[k].right = r;
     19     node[k].mid = (l + r) >> 1;
     20     if(l == r)
     21         return ;
     22     int mid = (l + r) >> 1;
     23     int lsame = mid - l + 1;
     24     for(int i = l;i <= r;i ++)
     25     {
     26         if(val[d][i] < sorted[mid])
     27             lsame --;
     28     }
     29     int lpos = l;
     30     int rpos = mid + 1;
     31     for(int i = l;i <= r;i ++)
     32     {
     33         if(i == l)
     34             ToLeft[d][i] = 0;
     35         else
     36             ToLeft[d][i] = ToLeft[d][i-1];
     37         if(val[d][i] < sorted[mid])
     38         {
     39             ToLeft[d][i] ++;
     40             val[d+1][lpos ++] = val[d][i];
     41         }
     42         else if(val[d][i] > sorted[mid])
     43         {
     44             val[d+1][rpos ++] = val[d][i];
     45         }
     46         else
     47         {
     48             if(lsame)
     49             {
     50                 ToLeft[d][i] ++;
     51                 val[d+1][lpos ++] = val[d][i];
     52                 lsame --;
     53             }
     54             else
     55                 val[d+1][rpos ++] = val[d][i];
     56         }
     57     }
     58     BuildTree(k << 1, d+1, l, mid);
     59     BuildTree(k << 1|1, d+1, mid + 1, r);
     60 }
     61 
     62 int Query(int l, int r, int k, int d, int idx)
     63 {
     64     if(l == r)
     65         return val[d][l];
     66     int s;
     67     int ss;
     68     if(l == node[idx].left)
     69     {
     70         s = ToLeft[d][r];
     71         ss = 0;
     72     }
     73     else
     74     {
     75         s = ToLeft[d][r] - ToLeft[d][l-1];
     76         ss = ToLeft[d][l-1];
     77     }
     78     if(s >= k)
     79     {
     80         int newl = node[idx].left + ss;
     81         int newr = node[idx].left + ss + s - 1;
     82         return Query(newl, newr, k, d + 1, idx << 1);
     83     }
     84     else
     85     {
     86         int mid = node[idx].mid;
     87         int b = r - l - s + 1;
     88         int bb = l - node[idx].left - ss;
     89         int newl = mid + bb + 1;
     90         int newr = mid + bb + b;
     91         return Query(newl, newr, k - s, d + 1,  idx << 1|1);
     92     }
     93 }
     94 
     95 int main(int argc, char const *argv[])
     96 {
     97     int c, n, m, l, r, k;
     98     //freopen("in.c", "r", stdin);
     99     scanf("%d", &c);
    100     while(c--)
    101     {
    102         scanf("%d%d", &n, &m);
    103         for(int i = 1;i <= n;i ++)
    104         {
    105             scanf("%d", &val[0][i]);
    106             sorted[i] = val[0][i];
    107         }
    108         sort(sorted + 1, sorted + n + 1);
    109         BuildTree(1, 0, 1, n);
    110         for(int i = 0; i< m;i ++)
    111         {
    112             scanf("%d%d%d", &l, &r, &k);
    113             printf("%d
    ", Query(l, r, k, 0, 1));
    114         }
    115     }
    116     return 0;
    117 }

     

  • 相关阅读:
    Firefly 介绍
    9秒社团跨平台开发引擎CrossApp宣布正式开源
    页面置换算法
    Selenium
    C++虚函数、虚继承
    链表题目
    二叉树分类
    求连续子数组的最大和
    拓扑排序
    二叉树题目
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3580889.html
Copyright © 2020-2023  润新知