【题目描述】
给定一个长度为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\n",h[(t1+t2)>>1]); } return 0; }