给出一个长度为N的序列,以及一个常数K,我们每一次计算.
从左向右计算,直到第一个di<k为止,然后删除第i个数,从新计算。
输出过程中删除的数的位子。
思路:
我们知道,如果第一轮删除了a【i】,那么下一轮删除的数字的位子pos,一定是大于i的。
那么过程我们动态维护一下算式即可。
我们拆开Di=(j-1)*Σaj-(j-1)*(n-i)*ai;
那么我们前部分就是一个动态的前缀和,过程维护一下n的大小动态修改就行。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
ll a[250000];
ll sum[250000];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
sum[0]=0;
for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);
ll bei=0;
ll now=0;
ll temp=n;
for(int i=2;i<=n;i++)
{
now+=a[i-1]*bei;
if(now-(temp-i+(n-temp))*a[i]*(i-1-(n-temp))<k)
{
temp--;
now-=a[i]*bei;
printf("%d\n",i);
}
else
{
bei++;
}
}
}
}