题解:CF1194E Count The Rectangles
考虑一个三次方做法:
枚举两条横线,求出有多少条竖线和两条横线都相交,假设为 个,那么对答案有 的贡献。复杂度 。
考虑求出每条横线与每条竖线是否相交,这部分可以 求出,那么就可以用 bitset 维护了,复杂度 ,适当卡常即可通过。
#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;
}

浙公网安备 33010602011771号