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;
}
posted @ 2018-12-04 09:49  ChunhaoMo  阅读(249)  评论(0)    收藏  举报