时间复杂度应该没错啊,,大佬们帮忙看看呗
#include<bits/stdc++.h>
using namespace std;
#define int long long
int sum[200005];//前缀和
int a[200005];//答案
int n,q;//数组个数和询问个数
int T;
int ans[200005];//答案数组
int cnt;//答案个数
inline int read()
{
int f=1,x=0;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();};
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();};
return f*x;
}
signed main()
{
T = read();
while(T--)
{
cnt = 0;
memset(ans,0,sizeof(ans));
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
n = read(),q = read();
for(int i = 1;i<=n;++i)
a[i] = read();
sort(a+1,a+1+n);
for(int i = 1;i<=n;++i)
sum[i] = sum[i-1]+a[i];
for(int i = 1;i<=q;++i)
{
int x;//需要操作的k
x = read();
int l = 1;
double avg = sum[n]*1.0/n*1.0;//算出平均数
avg -= x;//减掉k
int pos = lower_bound(a+1,a+1+n,avg) - a;//找到第一个大于avg的位置
while(pos==n&&a[pos]<avg) pos++;//当前可能不等于avg
while(pos!=l&&pos<=n)
{
l = pos;//将前面的删除
avg = (sum[n]-sum[l-1])*1.0/(n-l+1)*1.0;//再算新的avg
avg-=x;
if(a[l]>=avg) break;//如果第一个数大于avg退出
if(a[n]<avg) break;//如果a[n]比avg大就要全删了
if(l==n&&a[l]<avg) break;//因为调不出来的无聊尝试特判
pos = lower_bound(a+l,a+1+n,avg) - a;//再找
while(pos<=n&&a[pos]<avg) pos++; //当前可能不等于avg
}
if(a[l]==n&&a[l]<avg) ans[++cnt] = 0;//特判
else if(a[n]<avg) ans[++cnt] = 0;//特判
else
ans[++cnt] = n-l+1;//加入答案,也可以直接输出但是这样好调试
}
for(int i = 1;i<=cnt;++i)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}