当前位置: 首页 > news >正文

【补题】P9423 [蓝桥杯 2023 国 B] 数三角

题意:小明在二维坐标系中放置了 n 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形?

思路:这个数据量肯定不能n^3暴力,所以很简单就是对于每个点求其他点到这个点的距离,然后根据分组计算组合数,但是要注意三点贡献,其他就是代码的事情。

反思:这么简单的题……我的代码写的非常有问题,不仅组合数计算错误,其实分组也没分好,而且很多关键性质也没发现,只能说一坨了,那么代码好好纠正,我觉得以后得一步步写,不要脑子一热就开始了,参考了题解,写的十分优美
参考题解:题解:P9423 [蓝桥杯 2023 国 B] 数三角 - 洛谷专栏

那么我自己的代码其实跟题解一毛一样

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define int128 __int128
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 2e5+10;
const int INF = 1e18;
const int MOD = 1e9+7;

int x[N],y[N];
map<int,map<int,int> >  mp;

int cal(int a,int b){
	return( (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}

void solve(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> x[i] >> y[i];
		mp[x[i]][y[i]]++;
	}
	
	int ans=0;
	for(int i=0;i<n;i++){
		map<int,int> cnt;
		for(int j=0;j<n;j++){
			ans+=cnt[cal(i,j)];
			cnt[cal(i,j)]++;
		}
		for(int j=0;j<i;j++){
			if(((x[j]+x[i])%2)==0 && ((y[j]+y[i])%2)==0){
				ans-=mp[(x[j]+x[i])/2][(y[j]+y[i])/2];
			}
		}
	}
	
	cout << ans << endl;
	
}

signed main() {
	IOS;
	
	int t = 1;
//	cin >> t;
	while (t--) {
		solve();
	}
	
}

关了int long long,好像最后一个测试样例会爆。

相关文章:

  • 《软件工程类标准规范》写作方法和技巧
  • 【Python】什么是列表推导式?
  • 第七章 指针
  • qiankun微前端vue3+ts+vite(配置示例)
  • 【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
  • 【安全】加密算法原理与实战
  • 人工智能第一章 探索人工智能基石:从智能定义到模式识别的全面解析
  • MySQL--基础知识点--81.3--TRIGGER
  • 2025.4.10总结
  • 1200 模拟量输入输出功能
  • 图像生成模型的不可检测水印——Undetectable Watermark for Generative Image Models
  • 【hadoop】Hive数据仓库安装部署
  • oracle 并行度(Parallel Degree)
  • ZYNQ笔记(二):MIO 、EMIO
  • PyTorch复现多维逻辑回归
  • AI与5G的融合:如何实现更快速、更智能的物联网应用?
  • 在docker里装rocketmq-console
  • edis 主从复制
  • 在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序
  • Python常用排序算法