C. Good Array
链接
[https://codeforces.com/contest/1077/problem/C]
题意
给你一个数组,问你能去掉某个数使得剩下的数中某个数是其他数的和
输出个数以及他们的下标
分析
用一个结构体保存值和下标,按值从小到大排序,并统计总和
然后一个数一个数地去掉,看剩下的数是否满足,对1到i-1和i+1到n二分就出结果了
复杂度nlogn
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
struct str{
ll va,id;
}a[N];
ll b[N];
bool cmp(str a,str b){
return a.va<b.va;
}
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("in.txt","r",stdin);
int n;
while(cin>>n){
ll sum=0;
for(int i=1;i<=n;i++) {
cin>>a[i].va; a[i].id=i;
sum+=a[i].va;
}
sort(a+1,a+n+1,cmp);
//for(int i=1;i<=n;i++) cout<<a[i].va<<' '<<a[i].id<<endl;
int cnt=0;
for(int i=1;i<=n;i++){
ll x=sum-a[i].va;
bool flag=0;
int l=1,r=i-1;
while(l<=r){
int mid=(l+r)>>1;
if(x==2*a[mid].va){
b[cnt++]=a[i].id; flag=1;break;
}
else if(x>2*a[mid].va){
l=mid+1;
}
else{
r=mid-1;
}
}
if(!flag){
l=i+1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(x==2*a[mid].va){
b[cnt++]=a[i].id; break;
}
else if(x>2*a[mid].va){
l=mid+1;
}
else{
r=mid-1;
}
}
}
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
cout<<b[i]<<' ';
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号