题目大意就是对于一个有限数列,如果其中一个元素可以表示为数列中其他所有元素的和,则这个数列(数组)被称为Good Array。现在有一个数列a,请找出所有的元素,使得删去这些元素后这个数列为Good Array
思路:如果一个数列是Good Array,则一定是其他元素的和等于数列中最大的元素的值。故先排个序,然后用前缀和\[O(n)\]解决(注意要用long long)
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct node{
ll val;
ll id;
};
bool cmp(node a,node b)
{
return a.val<b.val;
}
node arr[2*maxn];
ll sum[2*maxn];
ll ans[2*maxn];
int main()
{
ll n;
cin>>n;mst(arr,0);
mst(sum,0);
mst(ans,0);
for(ll i=1;i<=n;i++){
cin>>arr[i].val;
arr[i].id=i;
}
sort(arr+1,arr+1+n,cmp);
for(ll i=1;i<=n;i++)
sum[i]=sum[i-1]+arr[i].val;
bool flag=0;ll cnt=0;
for(ll i=n;i>=1;i--){
if(i==n){
if(sum[n-2]==arr[n-1].val)
ans[cnt++]=arr[i].id;
}else if(i==1){
if(sum[n-1]-arr[1].val==arr[n].val)
ans[cnt++]=arr[i].id;
}else if(i==n-1){
if(sum[i-1]==arr[n].val)
ans[cnt++]=arr[i].id;
}else{
if(sum[i-1]+sum[n-1]-sum[i-1]-arr[i].val==arr[n].val)
ans[cnt++]=arr[i].id;
}
}
cout<<cnt<<endl;
for(ll i=0;i<cnt;i++){
if(i==0)
printf("%lld",ans[i]);
else
printf(" %lld",ans[i]);
}
return 0;
}