首页 > 其他分享 >P3217 [HNOI2011] 数矩形

P3217 [HNOI2011] 数矩形

时间:2023-10-31 18:47:34浏览次数:39  
标签:HNOI2011 long P3217 MAXN 对角线 矩形

P3217 [HNOI2011] 数矩形题解

前言

提交记录

本题其实并不是非常难想,那么为什么本蒟蒻还交了那么多发呢?

cal 函数求平方的时候传值未开 long long ,我谔谔。

正文

题面省流:给定 $n$ 个点求最大举行的面积,矩形的边可以不与坐标系垂直

如果每次枚举矩形的四个点的话,$O\left(n^4\right)$ 可以得到 $20%$ 的美妙暴力分。

看看正解?

要求矩形我们可以利用一些优美的数学性质:

矩形的对角线相等且互相平分。

也就是说我们可以枚举对角线,判断它们的中点是否重合,长度是否相等。

在 n<=1500 的情况下可O(n^4)枚举所有对角线,然后排序,排序主要关键字为坐标,次要关键字为权值。

对角线数量有n*(n-1)/2条,相当于O(n^2)遍历对角线,任意两条中点相同并且长度相同的对角线均计算其组成矩形面积并更新最大值。

一张图解决如何求面积:


贴码

#include<bits/stdc++.h>
#define MAXN 1510
using namespace std;
//ifstream is("num.in",ios::in);
//ofstream os("num.out",ios::out);
//#define cin is
//#define cout os
long long n,x[MAXN],y[MAXN],tote;
long long ans=0;
struct Edge{
	long long onex,oney,twox,twoy;
	long long midx,midy;
	long long dist;
}e[MAXN*MAXN];
bool cmp(Edge x,Edge y){
	if(x.midx==y.midx){
		if(x.midy==y.midy) return x.dist<y.dist;
		return x.midy<y.midy;
	}
	return x.midx<y.midx;
}
inline long long cal(long long x){
	return x*x;
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
	for(int i=1;i<=n;i++){
		for(int j=1+i;j<=n;j++){
			e[++tote].onex=x[i]; e[tote].oney=y[i];
			e[tote].twox=x[j]; e[tote].twoy=y[j];
			e[tote].midx=x[i]+x[j];
			e[tote].midy=y[i]+y[j];
			e[tote].dist=cal(x[i]-x[j])+cal(y[i]-y[j]);
		}
	}
	sort(e+1,e+tote+1,cmp);
	int st=0;
	for(int i=1;i<=tote;i++){
		if(e[i].midx==e[st].midx&&e[i].midy==e[st].midy){
			for(int j=st;j<=i;j++){
				if(e[i].dist==e[j].dist)
				ans=max(ans,(long long)(sqrt( cal(abs(e[i].onex-e[j].onex))+cal(abs(e[i].oney-e[j].oney)) )*sqrt( cal(abs(e[i].onex-e[j].twox) ) + cal(abs(e[i].oney-e[j].twoy) ) )));
			}
		}
		else if(e[i].midx!=e[st].midx||e[i].midy!=e[st].midy)st=i;
	} 
	cout<<ans;
	return 0;
}
/*
点个赞吧谢谢喵~
8
-2 3
-2 -1
0 3
0 -1
1 -1
2 1 
-3 1 
-2 1
*/

标签:HNOI2011,long,P3217,MAXN,对角线,矩形
From: https://www.cnblogs.com/AlpacaKing-presidential-palace/p/17800978.html

相关文章

  • P3214 [HNOI2011] 卡农 题解
    感觉不是很麻烦,可能就组合排列转化绕一点。。。抽象化题意给定\(n\)个元素,从中选出\(m\)个集合,要求:集合不为空,集合里不能有相同的元素\(m\)个集合都互不相同所有元素被选出的次数为偶数求方案数,并对\(100000007\)取模凭感觉是DP+组合数设\(dp[i][0/1]\)......
  • C++前缀和算法应用:矩形区域不超过 K 的最大数值和
    题目给你一个mxn的矩阵matrix和一个整数k,找出并返回矩阵内部矩形区域的不超过k的最大数值和。题目数据保证总会存在一个数值和不超过k的矩形区域。示例1:输入:matrix=[[1,0,1],[0,-2,3]],k=2输出:2解释:蓝色边框圈出来的矩形区域[[0,1],[-2,3]]的数值和是......
  • 小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象
    使用Python的OpenCV绘制矩形并提取对象OpenCV是一个开源计算机视觉和机器学习软件库。可以在它的帮助下完成各种图像处理操作,例如操纵图像和应用大量滤镜。它广泛用于对象检测、人脸检测和其他图像处理任务。让我们看看如何使用OpenCV在图像上绘制矩形并提取对象。编写代码#......
  • vue移动鼠标画矩形(抄别人的,下附原文地址)
    1、draw.js/***画布中绘制矩形*参数:cav-画布对象list-矩形数组i-选中矩形下标**//*操作执行方法分发*/exportfunctiondraw(cav,list,i){//画布初始化letctx=cav.getContext('2d');ctx.strokeStyle='blue';ctx.lineWidth=2;......
  • C#设计一个形状类和矩形类,含有周长面积等属性
    publicabstractclassShape{protecteddouble_area;protecteddouble_perimeter;publicdoubleArea{get{return_area;}}publicdoublePerimeter{get{return_perimeter;}}publicabstractv......
  • ArcGIS API for JS4.8绘制点、线、面、矩形、圆
    实现代码使用ArcGISAPIforJS4.8绘制点(Point)、线(Polyline)、面(Polygon)、矩形(Rectangle)、圆(Circle),使用Draw绘制,具体代码如下:<!DOCTYPEhtml><html><head><metacharset="utf-8"/><title>ArcGISdemo</title><linktyp......
  • P3214 [HNOI2011] 卡农
    原题首先我们先简化一下题意。为什么呢?因为这个题如果不简化题意是不太好做的我们考虑用二进制表示集合,这样题意为:有\(2^n-1\)个数,我们要从中选一个大小为\(m\)的无序子集,满足以下条件:集合中所有数的异或和为\(0\)集合中元素不可重复首先无序子集是吓人的,因为我们可......
  • vue2使用 AMap-Vue 高德地图(矩形、圆形、多边形)绘制电子围栏
     AMap-Vue 参考 安装使用|AMap-Vue(gitee.io)main.js引入importAmapVuefrom'@amap/amap-vue';Vue.use(AmapVue);AmapVue.config.key='您申请的key值';AmapVue.config.version='2.0';//默认2.0,这里可以不修改AmapVue.config.plugins=["A......
  • 【CSS】画自适应矩形
     <html><style>.box{/*1.padding-top根据父容器进行百分比计算数值的*//*width:50%;background:blue;padding-top:50%;*//*2.aspect-ratio:规定了纵横比,这个纵横比可以用来计算自动尺寸以及......
  • 矩形
    目录矩形应用应用1:Leetcode.223题目解题思路代码实现矩形应用应用1:Leetcode.223题目223.矩形面积给你二维平面上两个由直线构成且边与坐标轴平行/垂直的矩形,请你计算并返回两个矩形覆盖的总面积。每个矩形由其左下顶点和右上顶点坐标表示:第一个矩形由其左下顶......