题意:给定$n$和$r$,要找$n$个整点,使得他们两两距离的平方和最大,并且所有点到原点的距离必须小于$r$

很容易猜到答案在凸包上然后暴力找,但证明还是挺妙的

首先转化一下距离平方和

令$\vec{a_i}=\vec{OA_i}$,则$\sum\limits_{i\lt j}A_iA_j^2=\dfrac{\sum\limits_{i\neq j}A_iA_j^2}{2}=\dfrac{\sum\limits_{i\neq j}(\vec{a_i}-\vec{a_j})^2}{2}=\dfrac{\sum\limits_{i\neq j}(\vec{a_i}^2+\vec{a_j}^2-2\cdot\vec{a_i}\cdot\vec{a_j})}{2}$

对于每个$k$,当$i=k$时$\vec{a_k}^2$被计算$n-1$次,当$i\neq k$时被计算$n-1$次

再用和的平方公式处理一下两两做点积的项

原式$=\dfrac{2(n-1)\sum\limits_{1\leq i\leq n}\vec{a_i}^2-2[(\sum\limits_{1\leq i\leq n}\vec{a_i})^2-\sum\limits_{1\leq i\leq n}\vec{a_i}^2]}{2}=n\sum\limits_{1\leq i\leq n}\vec{a_i}^2-(\sum\limits_{1\leq i\leq n}\vec{a_i})^2$

为了让第一项尽可能大,选的点应该尽可能远离原点,为了让第二项尽可能小,选的点应该尽可能可以互相抵消(因为是向量和)

这提示了我们答案会分布在凸包上,下面我们来严格证明

假设已经确定了$A_{1\cdots n-1}$我们想确定最后一个点,设它为$P(x,y)$

新增加的距离平方和为$\sum\limits_{1\leq i\leq n-1}[(x-x_i)^2+(y-y_i)^2]$

整理一下,得到$(n-1)[(x-\frac{\sum\limits_{1\leq i\leq n-1}x_i}{n-1})^2-(\frac{\sum\limits_{1\leq i\leq n-1}x_i}{n-1})^2+\frac{\sum\limits_{1\leq i\leq n-1}x_i^2}{n-1}+(y-\frac{\sum\limits_{1\leq i\leq n-1}y_i}{n-1})^2-(\frac{\sum\limits_{1\leq i\leq n-1}y_i}{n-1})^2+\frac{\sum\limits_{1\leq i\leq n-1}y_i^2}{n-1}]$

后面那一大坨东西跟$x,y$无关,所以问题转换为求离$X(\dfrac{\sum\limits_{1\leq i\leq n-1}x_i}{n-1},\dfrac{\sum\limits_{1\leq i\leq n-1}y_i}{n-1})$最远的点

下面证$P$在凸包端点上

假设$P$不在凸包端点上,延长$XP$与凸包某边$AB$交于$P'$(交于端点直接取端点为更优解)

若$\angle AP'X\geq\dfrac{\pi}{2}$,则$AX\gt XP'\gt XP$,即选$A$更优

若$\angle BP'X\geq\dfrac{\pi}{2}$,则$BX\gt XP'\gt XP$,即选$B$更优

就这样证完了

所以一开始找一下凸包,然后暴力找到最优解

算一下就知道$r=29$的时候凸包的点数量最多,有$36$个,一点都不虚其实还是得感谢CF的评测机

我居然能找到一道Div2的E是暴力23333

#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
struct point{
	int x,y;
	point(int a=0,int b=0){
		x=a;
		y=b;
	}
}t;
point operator-(point a,point b){
	return point(a.x-b.x,a.y-b.y);
}
int operator*(point a,point b){
	return a.x*b.y-a.y*b.x;
}
vector<point>p;
vector<int>now,bes;
int n,r,ans;
void dfs(int chos,int las,int sx,int sy,int sx2,int sy2){
	if(chos==n){
		if(ans<n*(sx2+sy2)-sx*sx-sy*sy){
			ans=n*(sx2+sy2)-sx*sx-sy*sy;
			bes=now;
		}
		return;
	}
	for(int i=las;i<p.size();i++){
		now.push_back(i);
		dfs(chos+1,i,sx+p[i].x,sy+p[i].y,sx2+p[i].x*p[i].x,sy2+p[i].y*p[i].y);
		now.pop_back();
	}
}
int main(){
	scanf("%d%d",&n,&r);
	int i,s;
	for(i=-r;i<=0;i++){
		p.push_back(point(i,(int)sqrt(r*r-i*i)));
		while(p.size()>2&&(p[p.size()-2]-p[p.size()-3])*(p[p.size()-1]-p[p.size()-2])>=0){
			p[p.size()-2]=p[p.size()-1];
			p.pop_back();
		}
	}
	s=p.size();
	for(i=s-2;i>=0;i--)p.push_back(point(-p[i].x,p[i].y));
	for(i=1;i<s;i++)p.push_back(point(-p[i].x,-p[i].y));
	for(i=s-2;i>0;i--)p.push_back(point(p[i].x,-p[i].y));
	ans=0;
	dfs(0,0,0,0,0,0);
	printf("%d\n",ans);
	for(i=0;i<n;i++)printf("%d %d\n",p[bes[i]].x,p[bes[i]].y);
}

[CF460E]Roland and Rose的更多相关文章

  1. Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力

    E. Roland and Rose Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...

  2. Codeforces 460E Roland and Rose(暴力)

    题目链接:Codeforces 460E Roland and Rose 题目大意:在以原点为圆心,半径为R的局域内选择N个整数点,使得N个点中两两距离的平方和最大. 解题思路:R最大为30.那么事实 ...

  3. Codeforces 459E Roland and Rose

    本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做 题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度, ...

  4. Codeforces 460 DE 两道题

    D Little Victor and Set 题目链接 构造的好题.表示是看了题解才会做的. 假如[l,r]长度不超过4,直接暴力就行了. 假如[l,r]长度大于等于5,那么如果k = 1,显然答案 ...

  5. 用rose画UML图(用例图,活动图)

    用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...

  6. 解决Rational Rose 中 没有 Data modeler 选项的问题

    在  Rose  没有 Data modeler 选项的原因是没有将 Data modeler 这块功能勾选上. 解决方案: 菜单栏--Add-Ins--Add-Ins Manager-->找到 ...

  7. Rational Rose

    Rational Rose简明实用教程 http://furzoom.com/rational-rose-course/ Unidirectional Association 单向关联 general ...

  8. 带领大家安装Rational rose

    Rational rose下载地址:http://pan.baidu.com/s/1hqIIyJq?qq-pf-to=pcqq.c2c 下载好后,文件里有4个安装文档: 解压CD1和CD2到当前目录, ...

  9. UML基础与Rose建模实训教程

    目  录 第1章  初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章  Rational Rose工具... 6 2.1 安装与配置Rational Ro ...

随机推荐

  1. 湖南大学第十四届ACM程序设计新生杯 E.Easy Problem

    E.Easy Problem Description: Zghh likes number, but he doesn't like writing problem description. So h ...

  2. HDU 多校对抗赛 D Distinct Values

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. 用Hibernate实现分页查询

    分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: package com.entity; /** * @author:秦 ...

  4. mysql删除id最小的条目

    DELETE FROM 表1 WHERE Mid in (select Mid from (SELECT Min(Mid) Mid FROM 表1 c1) t1);

  5. 两个数组的交集 II [ LeetCode - 350 ]

      原题地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/description/   给定两个数组,写一个方法来计算 ...

  6. python构建一个项目

    二.实验步骤 2.1 实验准备 我们的实验项目名为 factorial. $ mkdir factorial $ cd factorial/ 2.2 主代码 我们给将要创建的 Python 模块取名为 ...

  7. 转:安装成功的nginx如何添加未编译安装模块

    原已经安装好的nginx,现在需要添加一个未被编译安装的模块 举例说明:安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存) nginx的模块是需要重新编译nginx,而不是像a ...

  8. 动态规划:LCS

    先上状态转移方程,还是很容易看明白的 例题是Codevs的1862,这个题不是实现了方程就可以了的,还要完成一个事情那就是计数,数一数到底有多少个最长公共子序列 #include<cstdio& ...

  9. 图论:2-SAT

    先象征性地描述一下问题:一组(或者一个)东西有且仅有两种选择,要么选这个,要么选那个,还有一堆的约束条件 图论问题,当然是建边跑图喽 给出模型: 模型一:两者(A,B)不能同时取 那么选择了A就只能选 ...

  10. 计算代码行数Demo源码

    源码下载:04-计算代码行数.zip24.1 KB////  main.m//  计算代码行数////  Created by apple on 13-8-12.//技术博客http://www.cn ...