题解: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;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现