题目传送门
这道题我们来寻找性质,用一个结构体来存储数据的值和数据的位置,并对数据的值将进行排序,并求前缀和,如果i-1的前缀和小于a[i]那么答案就一定不在1~i-1之间了,答案在i ~ n这个区间,因此记录下来,最后的ans以后的所有位置用一个数组存放起来,再对这个数组排序,最后的答案就是这个数组的数据。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
struct node{
ll num;
ll p;
}s[2102100];
ll sum[2102120];
ll an[21020000];
bool cmp(node x,node y){
return x.num<y.num;
}
int main(){
ll T;
cin>>T;
while(T--){
ll n;
cin>>n;
for(ll i=1;i<=n;i++){
cin>>s[i].num;
s[i].p=i;
}
sort(s+1,s+1+n,cmp);
for(ll i=1;i<=n;i++){
sum[i]=s[i].num+sum[i-1];
}
ll ans=1;//记录起始位置
for(ll i=1;i<=n;i++){
if(sum[i-1]<s[i].num)ans=i;
if(sum[i-1]==0)ans=i;
}
if(sum[n]==0)ans=n+1;
ll o=0;
for(ll i=ans;i<=n;i++)an[++o]=s[i].p;
if(ans<=n)sort(an+1,an+1+o);
printf("%lld\n",o);
for(ll i=1;i<=o;i++)printf("%lld ",an[i]);
printf("\n");
}
return 0;
}