比较容易观察的一道题,但是场上不开long long见祖宗了。
由于这题的 \(x\) 最大值比较小,所以我们可以直接存每个坐标是否有点。
有两种三角形符号条件:
- 存在两个点 \((x,0),(x,1)\),可以观察到任意的其它点都可以成为第三点。
- 有三个点为 \((x,0),(x+1,1),(x+2,0)\) 或 \((x,1),(x+1,0),(x+2,1)\),可以观察到这是一个腰为 \(\sqrt 2\) 的等腰直角三角形。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool e[200005][2];
signed main(){
int t;
cin>>t;
while(t--){
memset(e,0,sizeof e);
int n;
cin>>n;
vector<pair<int,int>> g(n+1);
for(int i=1;i<=n;i++){
cin>>g[i].first>>g[i].second;
e[g[i].first][g[i].second]=1;
}
int ans=0,ans2=0;
for(int i=1;i<=n;i++){
if(e[g[i].first][0]&&e[g[i].first][1]){
ans+=n-2;
}
if(e[g[i].first+1][!g[i].second]&&e[g[i].first+2][g[i].second]) ans2++;
}
cout<<ans/2+ans2<<endl;
}
return 0;
}
标签:int,题解,long,second,CF2009D,Satyam,Counting,first
From: https://www.cnblogs.com/cly312/p/18444982