HDU 5857 Median

写这道题真是痛苦啊,边写边在女队的讨论组里抱怨“我真的不会写大模拟啊”、“WA到死了已经”、“if else if else很好写么!!?”诸如此类,我已经做好赛场上碰到大模拟就丢给队友的准备了。。

不过还是要感谢一下这道题,我去学了一下对拍,虽然很简单,但是之前因为一直用不上所以一直没有学。苦兮兮的是我造了一些小范围的所有可能的样例,对拍都没错了,交上去还是WA。想了想这是去年的多校题,数据我应该还留着,跑了下发现爆int了,改成long long果断AC,一口老血啊。之前不是没有想到,只是我搜了几个题解他们都没开long long,觉得肯定是自己的if else写炸了。哎,平时练习干嘛不相信自己一下呢,浪费了这么多时间在一道水题上。。。

代码非常难看,有空学习一下简洁版题解的写法。。

#include <bits/stdc++.h>
using namespace std;
long long a[100005];
int main()
{
//    freopen("1001.in","r",stdin);
//    freopen("2.txt","w",stdout);
    int t,n,m,l1,r1,l2,r2;
    double ans; 
    scanf("%d",&t);
    while (t--) {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
        for (int i=0;i<m;i++) {
            scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
            if (l1>l2) swap(l1,l2),swap(r1,r2);
            if (l1<=l2&&r1>=r2) swap(r1,r2);
            int len1=r1-l1+1,len2=r2-l2+1,len=len1+len2,pos;
            if (r1<l2) {
                if (len&1) {
                    pos=len/2+1;
                    if (pos<=len1) ans=a[l1+pos-1];
                    else ans=a[l2+pos-len1-1];
                }
                else {
                    pos=len/2;
                    if (pos+1<=len1) ans=0.5*(a[l1+pos-1]+a[l1+pos]);
                    else if (pos>len1) ans=0.5*(a[l2+pos-len1-1]+a[l2+pos-len1]);
                    else ans=0.5*(a[r1]+a[l2]);
                }
            }
            else {
                int l=l2-l1+1,r=l+2*(r1-l2+1)-1;
                if (len&1) {
                    pos=len/2+1;
                    if (pos<l) ans=a[l1+pos-1];
                    else if (pos>r) ans=a[pos-r+r1];
                    else ans=a[(pos-l)/2+l2];
                }
                else {
                    pos=len/2;
                    if (pos+1<l) ans=0.5*(a[l1+pos-1]+a[l1+pos]);
                    else if (pos+1==l) ans=0.5*(a[l2-1]+a[l2]);
                    else if (pos==r) ans=0.5*(a[r1]+a[r1+1]);
                    else if (pos>r) ans=0.5*(a[pos-r+r1]+a[pos-r+r1+1]);
                    else if ((pos-l)&1) ans=0.5*(a[(pos-l)/2+l2]+a[(pos-l)/2+l2+1]);
                    else ans=a[(pos-l)/2+l2];
                }
            }
            printf("%.1f\n",ans);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值