中庸之道

【题目描述】

给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数。

数据保证序列中任意两个数不相同,且询问的所有区间长度为奇数。

【输入描述】

第一行为N,Q。

第二行N个数表示序列。

接下来Q行,每行为L,R,表示一次询问。

【输出描述】

输出Q行,对应每次询问的中位数。

【样例输入】

5 3

1 4 8 16 2

1 5

3 5

3 3

【样例输出】

4

8

8

【数据范围及提示】

40%的数据,N,Q ≤ 100;

70%的数据,N ≤ 100;

100%的数据,N ≤ 1000,Q ≤ 100000,序列中的元素为1到10^9之间的整数。

源代码:

#include<cstdio>
int m,n,i[1001],h[1001];
void qsort(int t1,int t2,int num) //改写快排。
{
    int x=t1,y=t2,s=h[(t1+t2)/2],t;
    do
    {
        while (h[x]<s)
          x++;
        while (h[y]>s)
          y--;
        if (x<=y)
        {
            t=h[x];
            h[x]=h[y];
            h[y]=t;
            x++;
            y--;
        }
    }
    while (x<=y);
    if (x<t2&&t2>=num) //再怎么排序也不会影响结果了,故放弃处理。
      qsort(x,t2,num);
    if (t1<y&&t1<=num)
      qsort(t1,y,num);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int a=1;a<=n;a++)
      scanf("%d",&i[a]);
    for (int a=1;a<=m;a++)
    {
        int t1,t2;
        scanf("%d%d",&t1,&t2);
        for (int a=t1;a<=t2;a++) //小白鼠数组。
          h[a]=i[a];
        qsort(t1,t2,(t1+t2)>>1);
        printf("%d
",h[(t1+t2)>>1]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5560008.html