[蓝桥杯]真题讲解:数三角(枚举+STL)
- 一、视频讲解
- 二、正解代码
- 1、C++
- 2、python3
- 3、Java
一、视频讲解
[蓝桥杯]真题讲解:数三角(枚举+STL)
二、正解代码
1、C++
#include<bits/stdc++.h>
#define int long long
using namespace std;signed main(){int n; cin >> n;vector<array<int,2>>a(n);map<pair<int,int>, int>node;for(int i = 0; i < n; i ++) {cin >> a[i][0] >> a[i][1];node[{a[i][0], a[i][1]}] ++;}int ans = 0;for(int i = 0; i < n; i ++) {map<int,vector<int>>st;for(int j = 0; j < n; j ++) {int dis = (a[i][0] - a[j][0]) * (a[i][0] - a[j][0]) + (a[i][1] - a[j][1]) * (a[i][1] - a[j][1]); if(dis)st[dis].push_back(j);}for(auto x: st) {vector<int>&no = x.second;int sum = no.size();ans += sum * (sum - 1) / 2;int del = 0;for(int j = 0; j < no.size(); j ++) {int x1 = a[i][0], y1 = a[i][1];int x2 = a[no[j]][0], y2 = a[no[j]][1];int x3 = x1 * 2 - x2, y3 = y1 * 2 - y2;del += (node[{x3, y3}]);}ans -= (del / 2);}}cout << ans << endl;return 0;
}
2、python3
n = int(input())
a = [list(map(int, input().split())) for i in range(n)]
node = {}
for x, y in a:key = (x, y)if key not in node:node[key] = 1else:node[key] += 1
ans = 0
dis = [[0] * n for i in range(n)]
for i in range(n):for j in range(i + 1, n):x1, y1 = a[i]x2, y2 = a[j]d = (x1 - x2) ** 2 + (y1 - y2) ** 2dis[i][j] = ddis[j][i] = dst = {}
for i in range(n):st.clear()x1, y1 = a[i]for j in range(n):if dis[i][j]:if dis[i][j] not in st:st[dis[i][j]] = [j]else:st[dis[i][j]].append(j)for d,no in st.items():sum = len(no)ans += sum * (sum - 1) // 2dell = 0for j in no:x2, y2 = a[j]x3 = x1 * 2 - x2y3 = y1 * 2 - y2if (x3, y3) in node:dell += node[(x3, y3)]ans -= (dell // 2)
print(ans)
3、Java
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();List<int[]> a = new ArrayList<>();Map<String, Integer> node = new HashMap<>();for(int i = 0; i < n; i ++) {int x = sc.nextInt();int y = sc.nextInt();a.add(new int[]{x, y});String no = x + "#" + y;node.put(no, node.getOrDefault(no, 0) + 1);}long ans = 0;for(int i = 0; i < n; i ++) {Map<Long, List<Integer>> st = new HashMap<>();for(int j = 0; j < n; j ++) {int x1 = a.get(i)[0], y1 = a.get(i)[1];int x2 = a.get(j)[0], y2 = a.get(j)[1];long dis = (long)Math.pow(x1 - x2, 2) + (long)Math.pow(y1 - y2, 2);if(dis == 0)continue;if(st.get(dis) == null)st.put(dis, new ArrayList<Integer>());st.get(dis).add(j);}for(Map.Entry<Long, List<Integer>> x: st.entrySet()){List<Integer>no = x.getValue();long sum = no.size();ans += sum * (sum - 1) / 2;long del = 0;for(int j = 0; j < no.size(); j ++) {int x1 = a.get(i)[0], y1 = a.get(i)[1];int x2 = a.get(no.get((j)))[0], y2 = a.get(no.get((j)))[1];int x3 = x1 * 2 - x2, y3 = y1 * 2 - y2;if(node.get(x3 + "#" + y3) != null)del += node.get(x3 + "#" + y3);}ans -= del / 2;}}System.out.println(ans);}
} }
}