感觉这场多校的题目不是小学数学就是初中英语,而且我都不会。。
我用二分做的,WA了很久,最后靠对拍过的。
如果用二分做的话细节太多了,很容易出错。
看到网上大部分解法都是讨论。
以后应该要给自己找一个实现起来比较简单的算法。
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int n,m,l1,r1,l2,r2;
int a[maxn];
double handle()
{
int l=min(l1,l2);
int r=max(r1,r2)+1;
int num=(r1-l1+1+r2-l2+1+1)/2;
while(l<r)
{
int m = l+((r-l)>>1);
int NUM = min(max(0,m-l1+1),r1-l1+1)+min(max(0,m-l2+1),r2-l2+1);
if(NUM<=num) l=m+1;
else r=m;
}
int k;
int m = l+((r-l)>>1)-1;
if(!((l1<=m&&m<=r1)||(l2<=m&&m<=r2))) m=min(r1,r2);
int NUM = min(max(0,m-l1+1),r1-l1+1)+min(max(0,m-l2+1),r2-l2+1);
if((l1<=l&&l<=r1)&&(l2<=l&&l<=r2)&&NUM<num) k=l;
else k=m;
if((r1-l1+1+r2-l2+1)&1) return a[k];
else
{
int NUM = min(max(0,k-l1+1),r1-l1+1)+min(max(0,k-l2+1),r2-l2+1);
if(NUM<=(r1-l1+1+r2-l2+1)/2)
{
int k2=k+1;
if(!((l1<=k2&&k2<=r1)||(l2<=k2&&k2<=r2))) k2=max(l1,l2);
return (1ll*a[k]+a[k2])/2.0;
}
else return a[k];
}
}
void solve()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=m;i++)
{
scanf("%d %d %d %d",&l1,&r1,&l2,&r2);
printf("%.1lf\n",handle());
}
}
int main()
{
//freopen("data.txt","r",stdin);
//freopen("wrong.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--) solve();
return 0;
}