互補二元組

分三處

1.當差值爲0並且只有一個二元組就不管他

2.當差值爲0並且二元組個數>=1加上他並減去它本身

3.當差值爲存在並且不爲0時直接加上他

因爲都計算了兩次,所以最後ans/2

用了map的結構,在數值大小處卡了2個小時,最後想起來是int 改成 long long Xi + Xj = Yi + Yj →Xi -Yi = Xj-Yj

希望你看完後留下你的小評論,我們大家一起進步。

時間限制:10000ms
單點時限:1000ms
內存限制:256MB

描述

給定N個整數二元組(X1, Y1), (X2, Y2), ... (XN, YN)。  

請你計算其中有多少對二元組(Xi, Yi)和(Xj, Yj)滿足Xi + Xj = Yi + Yj且i < j。

輸入

第一行包含一個整數N。  

以下N行每行兩個整數Xi和Yi。  

對於70%的數據,1 ≤ N ≤ 1000    

對於100%的數據,1 ≤ N ≤ 100000  -1000000 ≤ Xi, Yi ≤ 1000000

輸出

一個整數表示答案。

樣例輸入
5  
9 10  
1 3  
5 5  
5 4    
8 6
樣例輸出
2



#include<iostream>
#include<unordered_map>
using namespace std;
unordered_map<int,int>mymap;		//兩數之差 
int main(){
	long long n,x[100000],y[100000];
	cin>>n;
	for(long long i=0;i<n;i++){
		cin>>x[i]>>y[i];
		mymap[x[i]-y[i]]++;
		
	}
	long long ans=0,t=0;
	for(long long i=0;i<n;i++){
		if(mymap.find(y[i]-x[i])!=mymap.end()){
			if(y[i]==x[i]&&mymap[y[i]-x[i]]<=1){
			}
			else if(y[i]==x[i]&&mymap[y[i]-x[i]]>1){
				ans+=mymap[y[i]-x[i]]-1;
			}
			else {
				ans+=mymap[y[i]-x[i]];
			}
		}
	}
	cout<<ans/2<<endl;
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章