HDU 5857 Median(水~)

562 篇文章 1 订阅

Description
给出一个长度为n的有序序列Ai,m次查询,每次查询输入两个区间[l1,r1],[l2,r2],输出将这两个区间的数放在一起后的中位数
Input
第一行一整数T表示用例组数,每组用例首先输入两整数n和m表示序列长度和查询数,之后n个整数Ai表示该序列,之后每次输入四个整数l1,r1,l2,r2表示一次查询
(T<=200,n,m<=100000,Ai最多是32位int,l1<=r1,l2<=r2)
Output
对于每次查询,输出将两个区间中数放在一起后的中位数
Sample Input
1
4 2
1 2 3 4
1 2
2 4
1 1
2 2
Sample Output
2.0
1.5
Solution
简单题,找到中位数在哪个区间即可
Code

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 111111
int T,n,m,A[maxn],l1,l2,r1,r2,l,a,b,mid1,mid2;
double ans;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&A[i]);
        while(m--)
        {
            scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
            l=r1-l1+1+r2-l2+1;
            if(l2<l1)swap(l1,l2),swap(r1,r2);
            if(l2>r1)
            {
                a=r1-l1+1;
                if(l&1)
                {
                    mid1=l/2+1;
                    if(mid1>a)ans=A[l2+mid1-a-1];
                    else ans=A[l1+mid1-1];
                }
                else
                {
                    mid1=l/2,mid2=l/2+1;
                    double t1,t2;
                    if(mid1>a)t1=A[l2+mid1-a-1];
                    else t1=A[l1+mid1-1];
                    if(mid2>a)t2=A[l2+mid2-a-1];
                    else t2=A[l1+mid2-1];
                    ans=(t1+t2)/2;
                }
            } 
            else
            {
                if(r1>r2)swap(r1,r2);
                a=l2-l1,b=r1-l2+1;
                if(l&1)
                {
                    mid1=l/2+1;
                    if(mid1<=a)ans=A[l1+mid1-1];
                    else if(mid1<=a+2*b)ans=A[l2+(mid1-a+1)/2-1];
                    else ans=A[r1+mid1-a-2*b];
                }
                else
                {
                    mid1=l/2,mid2=l/2+1;
                    double t1,t2;
                    if(mid1<=a)t1=A[l1+mid1-1];
                    else if(mid1<=a+2*b)t1=A[l2+(mid1-a+1)/2-1];
                    else t1=A[r1+mid1-a-2*b];
                    if(mid2<=a)t2=A[l1+mid2-1];
                    else if(mid2<=a+2*b)t2=A[l2+(mid2-a+1)/2-1];
                    else t2=A[r1+mid2-a-2*b];
                    ans=(t1+t2)/2;
                }
            }
            printf("%.1f\n",ans);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值