写这道题真是痛苦啊,边写边在女队的讨论组里抱怨“我真的不会写大模拟啊”、“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;
}