题解:CF1194E Count The Rectangles

考虑一个三次方做法:

枚举两条横线,求出有多少条竖线和两条横线都相交,假设为 cc 个,那么对答案有 (c2)\dbinom{c}{2} 的贡献。复杂度 O(n3)O(n^3)

考虑求出每条横线与每条竖线是否相交,这部分可以 O(n2)O(n^2) 求出,那么就可以用 bitset 维护了,复杂度 O(n3ω)O(\dfrac{n^3}{\omega}),适当卡常即可通过。

#pragma GCC optimize("-Ofast,fast-math,-inline")
#pragma GCC target("avx,sse,sse2,sse3,sse4,popcnt") 
#include <bits/stdc++.h>
using namespace std;

const int N = 5e3 + 5;

#define x1 X1
#define y1 Y1
#define x2 X2
#define y2 Y2

int t, n, k;

int x1[N], y1[N], x2[N], y2[N];
long long ans=0ll;

bitset<N> bt[N];

int main()
{
	ios::sync_with_stdio(0), cin.tie(0);
	cin>>n;
	vector<int> v;
	for(int i=1;i<=n;i++)
	{
		cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(y1[i]!=y2[i]) continue;
		for(int j=1;j<=n;j++)
		{
			if(y1[j]==y2[j]) continue;
			int l=y1[j],r=y2[j];
			if(l>r) swap(l,r);
			if(y1[i]<l||y1[i]>r) continue;
			int nl=x1[i],nr=x2[i];
			if(nl>nr) swap(nl,nr);
			if(x1[j]<nl||x1[j]>nr) continue;
			bt[i][j]=1;
			//cout<<"!!!: "<<i<<" "<<j<<"\n";
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(y1[i]!=y2[i]) continue;
		for(int j=1;j<=n;j++)
		{
			if(y1[j]!=y2[j]||y1[j]>=y1[i]) continue;
			int cnt=(bt[i]&bt[j]).count();
			ans=(ans+1ll*cnt*(cnt-1)/2);
			//cout<<"!!!: "<<i<<" "<< j <<" " << cnt<<"\n";
		}
	}
	cout<<ans<<"\n";
	return 0;
}
posted @   HappyBobb  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示