930 ModricWang's Polygons

思路

首先要想明白,哪些多边形可能是格点正多边形?

分情况考虑:

三角形不可能,因为边长为有理数的正三角形的面积为无理数,而格点三角形的面积为有理数,二者矛盾。

正四边形毫无疑问是可以的。

边数>4时,可以考虑无穷递降法:

以六边形为例,假如整点正六边形存在,一定有边长最小的一个,记作\(A_1 A_2 A_3 A_4 A_5 A_6\)。以\(A_2\)为中心,将\(A_1\)逆时针旋转90度,得到\(B_1\)。显然也是整点。类似定义\(B_2 ... B_6\),它们也都是整点。【注:上面用到如下结论:一个整点绕另一个整点旋转90度,得到的点仍然是整点。证明很容易。】如你所见,\(B_1 B_2 B_3 B_4 B_5 B_6\)是一个更小的整点正六边形,矛盾。

对于边数>4的其他情况,也可以用类似方法证明。

参考自这里

于是该问题就变成了统计格点正四边形的数量。考虑枚举任意两个点形成的线段,那么由这一条线段可以形成的格点正四边形只有两个,并且另外两个点的坐标是可以直接算出来的。因此只要枚举任意两点的组合,验证以这两个点为相邻两点的格点正四边形是否存在即可。

时间复杂度\(O(n^2)\),空间复杂度\(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long
#define mk make_pair
#define y1 yyy
using namespace std; const int N = 1e3 + 5; map<pair<int, int>, bool> M;
int x[N], y[N], n, ans; int main() {
int T;
while (scanf("%d", &n) != EOF) {
ans = 0;
M.clear();
for (int i = 1; i <= n; i++) {
scanf("%d %d", x + i, y + i);
M[mk(x[i], y[i])] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int dx = y[j] - y[i];
int dy = x[i] - x[j];
int ok = 0;
if (M.count(mk(x[i] + dx, y[i] + dy)))
ok++;
if (M.count(mk(x[j] + dx, y[j] + dy)))
ok++;
if (ok == 2)
ans++;
ok = 0;
if (M.count(mk(x[i] - dx, y[i] - dy)))
ok++;
if (M.count(mk(x[j] - dx, y[j] - dy)))
ok++;
if (ok == 2)
ans++;
}
}
printf("%d\n", ans / 4);
}

2016级算法第三次上机-E.ModricWang's Polygons的更多相关文章

  1. 2016级算法第三次上机-F.ModricWang的导弹防御系统

    936 ModricWang的导弹防御系统 思路 题意即为:给出一个长度为n的序列,求出其最长不降子序列. 考虑比较平凡的DP做法: 令\(nums[i]\) 表示这个序列,\(f[x]\) 表示以第 ...

  2. 2016级算法第三次上机-G.Winter is coming

    904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划. ...

  3. 2016级算法第三次上机-C.AlvinZH的奇幻猜想——三次方

    905 AlvinZH的奇幻猜想--三次方 思路 中等题.题意简单,题目说得简单,把一个数分成多个立方数的和,问最小立方数个数. 脑子转得快的马上想到贪心,从最近的三次方数往下减,反正有1^3在最后撑 ...

  4. 2016级算法第三次上机-B.Bamboo和巧克力工厂

    B Bamboo和巧克力工厂 分析 三条流水线的问题,依然是动态规划,但是涉及的切换种类比较多.比较易于拓展到n条流水线的方式是三层循环,外层是第k个机器手,里面两层代表可切换的流水线 核心dp语句: ...

  5. 2016级算法第三次上机-D.双十一的抉择

    915 双十一的抉择 思路 中等题.简化题目:一共n个数,分成两组,使得两组的差最接近0,就是说要使两组数都尽可能的接近sum/2. 思路还是很混乱的,不知道如何下手,暴力也挺难的,还不能保证对.想一 ...

  6. 2016级算法第三次上机-A.Bamboo的小吃街

    A Bamboo的小吃街 分析 经典的两条流水线问题,题目描述基本类似于课件中的流水线调度,符合动态规划最优子结构性质 关键的动态规划式子为: dp[0][j] = min(dp[0][j - 1], ...

  7. 2016级算法第五次上机-G.ModricWang的撒币游戏

    1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...

  8. 2016级算法第五次上机-F.ModricWang的水系法术

    1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...

  9. 2016级算法第四次上机-B ModricWang的序列问题

    1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...

随机推荐

  1. 由浅到深理解ROS(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  2. windows编程之内核对象

          学好windows编程,理解内核对象还是至关重要的(●'◡'●).闲话不多说,下面先来了解一下关于内核对象的知识:       内核对象(kernel object):内核对象是用于管理进 ...

  3. archives of source

    "ubuntu 暂时不能解析域名 archive.ubuntu.com"怎么办? root下输入命令:lsb_release -a用来查询Ubuntu版本号 登录网站 http:/ ...

  4. fitting 方法的异常值过滤

    training = pd.DataFrame({'x':[3,6,9,15,300, 20,85]}).  原始数据training_fitting = pd.DataFrame({'x':[4,7 ...

  5. PHP发红包程序限制红包的大小

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  6. yii2 gridview 新增按钮 动态显示按钮

    新增一个按钮 [ 'class' => 'yii\grid\ActionColumn', 'header' => '操作', 'options' => ['width' => ...

  7. pig(数据流语言和编译器)学习https://www.w3cschool.cn/apache_pig/apache_pig_execution.html

    当我们配置了hadoop集群执行的时候 可以通过命令ls进行查看 存储语法 STORE Relation_name INTO ' required_directory_path ' [USING fu ...

  8. opencv——pcb上找圆mark点(模板匹配)

    #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <cxcore.h ...

  9. Nhibernate 存储过程获取返回值

    写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...

  10. Wait--常见的等待类型

    --==================================================================================--SLEEP_BPOOL_FL ...