感觉我的思路没啥问题,但是只对一个点,帮帮孩子
主要思路就是根据每个坐标的前面坐标个数和后面坐标个数来算覆盖该坐标的区间个数,再把两个坐标之间的所有坐标也统计一下。暂时没找到反例。
#include<bits/stdc++.h>
#define max(a,b) a>=b?a:b
using namespace std;
int N;
int n,t,js,maxn;
int a[100039],l[100039],r[100039];
int main()
{
// freopen("2.in","r",stdin);
scanf("%d",&N);
while(N--){
scanf("%d %d",&n,&t);
int check[500039]={0};
memset(check, 0, 500039);
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
l[i]=i-0;
r[i]=n-1-i;
check[r[i]+l[i]*(r[i]+1)]++;//统计每个坐标被覆盖几次
maxn=max(maxn,check[r[i]+l[i]*(r[i]+1)]);//同于特判,防止出现查找的数过于大超过范围
}
for(int i=0;i<n-1;++i){
check[l[i+1]*r[i]]+=a[i+1]-a[i]-1;//统计相邻坐标间的被覆盖几次
maxn=max(maxn,check[l[i+1]*r[i]]);
}
for(int i=0;i<t;++i){
scanf("%d",&js);
if(js>maxn)printf("0 ");
else
printf("%d ",check[js]);
}
printf("\n");
}
return 0;
}