uva 11386 Triples (hash总是wa,于是模拟STL)

uva 11386 Triples 这题 应该用 hash , 用 STL map超时,但是我自己手写二分,再加一些优化,限时8秒,我7.8秒卡过,很爽!

这题弹了很多遍,注意的是,ans 用int 不够,最后直接改为long long  就过了,因为这题数据没说范围,只说了是正整数,所以有点不爽啊。。。但是,ans可以算出来绝对超过 int 的 ,因为最多5000个数,如果有1000个1  1000个2  3000个3 答案就是  3e9 超过int 了

#include <iostream>
#include <cstdio> 
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn=5010;
long long a[maxn],n;
map <long long,int> mp;
map <long long,int>::iterator it;
vector <long long> v;
vector <int> cnt;

int binaryS(int left,int c){
	int l=left,r=v.size()-1;
	while(l<r){
		int mid=(l+r)/2;
		if(v[mid]>=c) r=mid; 
		else l=mid+1;
	}
	return r;
}

int main(){
	while(scanf("%d",&n)!=EOF){
		long long int ans=0;
		mp.clear();v.clear();cnt.clear();
		for(int i=0;i<n;i++){
			scanf("%lld",&a[i]);
			mp[a[i]]++;
		}
		for(it=mp.begin();it!=mp.end();it++){
			v.push_back(it->first);
			cnt.push_back(it->second);
		}
		sort(a,a+n);
		for(int i=0;i<n;i++){
			int left=0;
			for(int j=i+1;j<n;j++){
				long long sum=a[i]+a[j];
				int pos=binaryS(left,sum);
				if(v[pos]!=sum) continue;
				ans+=cnt[pos];
				left=max(pos-1,left);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
} 


posted @ 2013-08-21 12:32  炒饭君  阅读(161)  评论(0编辑  收藏  举报