L. Let's Make a Convex!

https://qoj.ac/contest/2562/problem/14692
双指针,这种感觉像O(n2)的都是双指针来做的。但是指针的移动你一定要看仔细了,要画图。先是l和r都要移动来保证长度,然年后进行判断,区间一定是连续的,因为这个要符合贪心。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T;
long long a[N];
long long sum[N];
long long ans[N];
int g[N];
int n;
int main()
{
	cin>>T;
	while(T--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			ans[i]=0;
			sum[i]=0; 
		}
		sort(a+1,a+1+n); 
		sum[0]=0;
		for(int i=1;i<=n;i++)
		{
			sum[i]=sum[i-1]+a[i];
		}
		int l=1,r=n;

		while(l<r)
		{
			int len=r-l+1;
			while(l>1&&sum[r]-sum[l-1]<=2*a[r]) 
			{
				l--;
				r--;
			}
			if(len<=2)
			{
				break;	
			}	
			if(sum[r]-sum[l-1]>2*a[r])
			{
				ans[len]=sum[r]-sum[l-1];
				l++;
			}
			else
			{
				r--;
			}
		} 
		for(int i=1;i<=n;i++)
		{
			cout<<ans[i]<<' ';
		}
		cout<<endl;
	}
	
	
	
	return 0;
}
posted @ 2026-01-21 17:56  曾翎一  阅读(2)  评论(0)    收藏  举报