HDU-5857-Median

原创 2016年08月30日 20:08:16

链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5857

题意:求有序序列中[l1,r1],[l2,r2]两端区间的中间数

题解:由于是有序序列且数组较大,直接针对两段区间的所有相交情况进行判断处理对中间数定位就好。

CODE:

#include <bits/stdc++.h>
using namespace std;
#define PI acos(-1)
#define eps 1e-5
const int MAXN = 1e5+7;
long long a[MAXN];
int main()
{
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; ++i)
            scanf("%I64d",&a[i]);
        int l1,r1,l2,r2,len1,len2,mid,all,poi;
        long long p1,p2;
        double ans;
        for(int i=0; i<m; ++i)
        {
           scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
            l1--,l2--,r1--,r2--;
            if(l1>l2)
            {
                swap(l1,l2);
                swap(r1,r2);
            }
            len1=r1-l1+1;
            len2=r2-l2+1;
            all=len1+len2;
            mid=all/2+1;
            if(r1<l2)//不相交
            {
                if(all&1)
                {
                    if(l1+mid-1>r1)ans=a[l2+mid-len1-1];
                    else ans=a[l1+mid-1];
                }
                else
                {
                    poi=mid-1;
                    if(l1+mid-1>r1)p1=a[l2+mid-len1-1];
                    else p1=a[l1+mid-1];
                    if(l1+poi-1>r1)p2=a[l2+poi-len1-1];
                    else p2=a[l1+poi-1];
                    ans=(p1+p2)*1.0/2.0;
                }
            }
            else//相交
            {

                if(r1<r2)//不包括
                {
                    poi=mid-(l2-l1);
                    if(poi<=0)
                        ans=a[l1+mid-1];
                    else
                    {
                        int f=(r1-l2+1)<<1;
                        if(f+l2-l1>=mid)
                            ans=a[ l2+(poi-1)/2 ];
                        else
                            ans=a[l1+mid-1-(r1-l2+1)];
                    }
                }
                else //包括
                {
                    poi=mid-(l2-l1);
                    if(poi<=0)
                        ans=a[l1+mid-1];
                    else
                    {
                        int f=(r2-l2+1)<<1;
                        if(f+l2-l1>=mid)
                            ans=a[ l2+(poi-1)/2 ];
                        else
                            ans=a[l1+mid-1-(r2-l2+1)];
                    }
                }
                if(!(all&1))
                {
                    mid--;
                    if(r1<r2)//不包括
                    {
                        poi=mid-(l2-l1);
                        if(poi<=0)
                            p1=a[l1+mid-1];
                        else
                        {
                            int f=(r1-l2+1)<<1;
                            if(f+l2-l1>=mid)
                                p1=a[ l2+(poi-1)/2 ];
                            else
                                p1=a[l1+mid-1-(r1-l2+1)];
                        }
                    }
                    else //包括
                    {
                        poi=mid-(l2-l1);
                        if(poi<=0)
                            p1=a[l1+mid-1];
                        else
                        {
                            int f=(r2-l2+1)<<1;
                            if(f+l2-l1>=mid)
                                p1=a[ l2+(poi-1)/2 ];
                            else
                                p1=a[l1+mid-1-(r2-l2+1)];
                        }
                    }
                    ans=(ans+p1)*1.0/2.0;
                }
            }
            printf("%.1f\n",ans);
        }
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

2016多校训练Contest10: 1001 Median hdu5857

Problem Description There is a sorted sequence A of length n. Give you m queries, each one contai...

Median(HDU-5857)

点击打开原题链接 Problem Description There is a sorted sequence A of length n. Give you m queries, each ...

2016多校训练Contest10: 1001 Median hdu5857

题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5857 MedianProblem DescriptionThere is a sorted ...

Median - hdu5857

题目链接 题意:给你一个包含n个数的序列和m个询问,每个询问包含两个区间,求出这两个区间包含的所有数的中位数。 思路:分两种情况讨论即可,一种是两区间没有交集,一种是有交集。 代码: /// ...

hdu 3648 Median Filter

我们按“S”型枚举每一个点,如左图:即右->下->左->下->右.... 用一个集合存储当前子正方形内的数,下一次查找时,插入新的一列,删除旧的列。如右图:当前枚举点150(三角标记),黑色正方形的...

hdu step5.3.3 Median Filter(树状数组求第k大的值)

Hdu 3648 step5.3.3 Median Filter   Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/3...

hdu 4981 Goffi and Median(BestCoder Round #6)

Goffi and Median Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • caduca
  • caduca
  • 2014-08-25 20:37
  • 4463

hdu 3648 Median Filter 树状数组+二分查找+优化

题意:gei yi

HDU 3648 Median Filter

弱渣花了好几天终于把这题A了_(:з」∠)_ 可能因为大牛们认为这题太简单吧,网上的题解都不怎么带注释。特别是那个S型走法,看的博(ruo)主(cai)一愣一愣的_(:з」∠)_ 因此AC后打算整理下...

HDU 4981 Goffi and Median——BestCoder Round #6

HDU 4981 Goffi and Median——BestCoder Round #6
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)