题解分享
题解分享简介
数三角(编程题) - 题解
真的很疑惑为什么其他平台上可以ac的代码这里是全错???
```
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005;
typedef pair<int,int>P;
int n,ans;
struct no
{
int x,y;
}q[N];
map<P,int>mp;
int f(int i,int j)
{
return (q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y);
}
signed main()
{
scanf("%lld",&n);
//1.map统计各个点出现次数
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&q[i].x,&q[i].y);
mp[{q[i].x,q[i].y}]++;
}
//2.开始枚举顶点
for(int i=1;i<=n;i++)
{
map<int,vector<int>>st;
for(int j=1;j<=n;j++)
{
int dis=f(i,j);
if(dis)st[dis].push_back(j);//存储到i点距离为dis的点,分类
}
//计算合法的数量
for(auto &x:st)
{
vector<int>&v=x.second;
int sum=(int)v.size();
ans+=sum*(sum-1)/2;
//还要再看三点共线的
int cnt=0;
for(int j=0;j<sum;j++)//遍历这里相同距离的点
{
int x1=q[i].x,y1=q[i].y;//枚举的顶点
int x2=q[v[j]].x,y2=q[v[j]].y;
int x3=2*x1-x2,y3=2*y1-y2;
cnt+=(mp[{x3,y3}]);//对于找到的这些点,取出其数量
}
ans-=(cnt/2);//因为重复计算了
}
}
printf("%lld",ans);
return 0;
}
```
查看全文
1
0
0
6
数三角(编程题) - 题解
```
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int,int>
#define endl '\n'
#define print(x) cout<<#x<<'='<<(x)<<endl;
int n;
const int N=3e3+5;
int x[N],y[N];
ll ans=0;
unordered_map<ll,ll> mp;
map<PII,int> vis;
ll dis(int i,int j)
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;i++)
{
mp.clear();
vis.clear();
for(int j=1;j<=n;j++)
{
if(i==j)
{
continue;
}
vis[{x[j],y[j]}]=1;
mp[dis(i,j)]++;
//(a,b),(x[j],y[j])的中点坐标是(x[i],y[i])
int a=2*x[i]-x[j];
int b=2*y[i]-y[j];
if(mp[dis(i,j)]>=2)
{
if(vis[{a,b}]==1)//三点共线
{
ans+=mp[dis(i,j)]-1-1;
}
else
{
ans+=mp[dis(i,j)]-1;
}
}
}
}
cout<<ans;
}
```
我觉得作者的数据是错的。我的代码可以在牛客上过掉69%(剩下的是因为超时,但是我感觉o(n^2)的应该可以呀),但是在本网站上就是WA。牛客上的原题:等腰三角形(hard) (nowcoder.com)
查看全文
0
0
1
2
数三角(编程题) - 题解
我不理! $O(n^3) 纯暴力理论上也可以过$
[x] 😕
```cpp
#include <cstdio>
#include <cmath>
#include <vector>
#include <utility>
using namespace std;
using ll = long long;
double getLen(const pair<ll, ll>& a, const pair<ll, ll>& b) {
return sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second, 2));
}
int main() {
int n;
scanf("%d", &n);
vector<pair<ll, ll>> arr(n);
for (int i = 0; i < n; ++i) {
ll x, y;
scanf("%lld %lld", &x, &y);
arr[i] = make_pair(x, y);
}
ll res = 0; // 10^3 ~ o(n^3) -> o(10^9) 理论上勉勉强强吧?
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
double a = getLen(arr[i], arr[j]);
double b = getLen(arr[i], arr[k]);
double c = getLen(arr[k], arr[j]);
if ((a + b > c && a + c > b && b + c > a)
&& (a == b || b == c || a == c)) {
// printf("%.2f %.2f %.2f | i %d, j %d, k %d\n", a, b, c, i, j, k);
++res;
}
}
}
}
printf("%lld\n", res);
return 0;
}
```
查看全文
0
0
0
1



