题解:CF2009D Satyam and Counting

比较容易观察的一道题,但是场上不开 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;
}
posted @ 2024-10-02 18:57  cly312  阅读(56)  评论(0)    收藏  举报