小雨初晴 题解分享 · 2024/5/9
数三角(编程题) - 题解
真的很疑惑为什么其他平台上可以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
灵赵菡芮 题解分享 · 2024/5/24
数三角(编程题) - 题解
``` #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
Heng_Xin 题解分享 · 2024/5/10
数三角(编程题) - 题解
我不理! $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