大佬帮我看看啊,,t掉最后一个点,不知道为啥
查看原帖
大佬帮我看看啊,,t掉最后一个点,不知道为啥
580872
zhuyin123楼主2021/12/6 21:34

时间复杂度应该没错啊,,大佬们帮忙看看呗

#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;
}
2021/12/6 21:34
加载中...