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;
}
#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;
}