题目链接:题目
大意:
给出一堆二维点,其中y只能为0或1,求能组成多少个直角三角形。
思路:
考虑两种情况,如果有两个点x相同,那么可以得到一条直角边,任意与剩下n-2个点都能组成直角三角形;如果选定一个点作为直角顶点,那么只有在它的两旁都恰好有点的情况下才能组成。
容易看出,所有点都是无序的,所以可以用哈希表储存,特别是这种配对的题目可以方便查找。不过unordered_set不能够存储pair,所以使用set。(这里solve的参数最好用vector& a,提高效率)
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vector
int solve(int n,vec<pii> a){
set<pii> s;
for(auto p:a)s.insert(p);
int ans=0;
for(auto p:s){
if(p.se==0&&s.find({p.fi,1})!=s.end())ans+=n-2;
if(p.se==0&&s.find({p.fi-1,1})!=s.end()&&s.find({p.fi+1,1})!=s.end())ans++;
if(p.se==1&&s.find({p.fi-1,0})!=s.end()&&s.find({p.fi+1,0})!=s.end())ans++;
}
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vec<pii> a(n);
for(int i=0;i<n;i++)cin>>a[i].fi>>a[i].se;
cout<<solve(n,a)<<endl;
}
return 0;
}