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;
}

浙公网安备 33010602011771号