题解
2025-03-25 20:14:27
发布于:北京
73阅读
0回复
0点赞
枚举垂足点 。
如果我们知道另一个点 ,那么我们可以知道构成直角三角形的点 在某条直线上。
所以我们对于每一个 ,记录一下它的向量如何表示。
然后统计 的数量。
由于三角形算了两遍,记得除以 。
Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pll pair<ll,ll>
#define mkp make_pair
#define fir first
#define sec second
ll n,ans;
pll t;
ll x[1505],y[1505];
map<pll,ll> mp;
inline pll slope(const ll &a,const ll &b){
if(a==0&&b==0) return mkp(0,0);
ll g=__gcd(a,b);
ll aa=a/g,bb=b/g;
if(aa<0||aa==0&&bb<0) aa=-aa,bb=-bb;
return mkp(aa,bb);
}
int main(){
cin>>n;
for(ll i=1;i<=n;i++) cin>>x[i]>>y[i];
for(ll i=1;i<=n;i++){
mp.clear();
for(ll j=1;j<=n;j++){
if(i==j) continue;
mp[slope(x[j]-x[i],y[j]-y[i])]++;
}
for(auto &it:mp){
if(it.fir.fir==0) t=mkp(1,0);
else if(it.fir.sec==0) t=mkp(0,1);
else{
t=mkp(-it.fir.sec,it.fir.fir);
if(t.fir<0||t.fir==0&&t.sec<0) t=mkp(-t.fir,-t.sec);
}
ans+=mp[t]*it.sec;
}
}
cout<<(ans>>1);
return 0;
}
全部评论 2
我就是用斜率A的
把斜率代码发我我帮你看看2025-03-23 来自 广东
0#include<bits/stdc++.h> using namespace std; #define ll long long #define ldb long double ll n,ans; ldb t; ll x[1505],y[1505]; map<ldb,ll> mp; inline ldb slope(const ll &a,const ll &b){ if(x[a]==x[b]) return 1e18; return 1.0*(y[b]-y[a])/(x[b]-x[a]); } int main(){ cin>>n; for(ll i=1;i<=n;i++) cin>>x[i]>>y[i]; for(ll i=1;i<=n;i++){ mp.clear(); for(ll j=1;j<=n;j++){ if(i==j) continue; mp[slope(i,j)]++; } for(auto &it:mp){ if(it.first==0) t=1e18; else if(it.first>=9e17) t=0; else t=-1.0/it.first; if(mp.count(t)) ans+=mp[t]*it.second; } } cout<<(ans>>1); return 0; }
2025-03-23 来自 北京
0太可怕了我作业还没写
2025-03-23 来自 北京
0?不是哥们这么短逗我呢
2025-03-23 来自 广东
0
笑点解析:我在考场上使用了禁忌之术
map <pair <int, int>, int> mp[1505];
9AC 1MLE
138MB遗憾离场2025-03-23 来自 广东
0
有帮助,赞一个