BZOJ 1100: [POI2007]对称轴osi
1100: [POI2007]对称轴osi
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 630 Solved: 243
[Submit][Status][Discuss]
Description
FGD小朋友——一个闻名遐迩的年轻数学家——有一个小MM,yours。FGD小朋友非常喜欢他的MM,所以他很乐
意帮助他的MM做数学作业。但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题。不幸的
是,yours是一个十分用功的学生,所以她不停地让FGD帮助她检查她的作业。一个阳光明媚的周末,yours的数学
老师布置了非常多的寻找多边形的对称轴的题,足够她做相当长的一段时间了。在此之前FGD已经决定去海边度过
这个难得的假期,不过他还是觉得应该帮助他的MM对付可爱的数学作业。很快地,他找到了解决方案,最好写一个
程序来帮助yours检查她的数学作业。因为FGD并非一个计算机科学家,所以他找到了他的好朋友你,请你帮助他完
成这个任务。请写一个程序:读入多边形的描述计算出每个多边形的对称轴数将计算的结果输出
Input
输入的第一行包含一个正整数t(1<=t<=10),为多边形的边数。接下来,为t个多边形的描述,每个描述的第一
行为一个正整数n(3<=n<=100000),表示了多边形的点数。然后在后面n行每行两个整数x和y(?100000000<=x, y<=1
00000000),依次表示多边形的顶点坐标。多边形不一定是凸的,但是不自交——任何两条边都只有最多一个公共
点——他们的公共端点。此外,没有两条连续的边平行。
Output
你的程序应该输出正好t行,第k行包含了一个整数nk——表示第k个多边形有多少个对称轴。
Sample Input
12
1 -1
2 -1
2 1
1 1
1 2
-1 2
-1 1
-2 1
-2 -1
-1 -1
-1 -2
1 -2
6
-1 1
-2 0
-1 -1
1 -1
2 0
1 1
Sample Output
2
HINT
Source
分析
概括:求多边形对称轴数,O(边数)。
远看计算几何,近看字符串处理,2333~~~
考虑如果能够把多边形用字符串表示出来,对称就可以翻译为回文。
然后选择用每条边的长度和两条临边的叉积表示角度,即可翻译成字符串。
代码
#include <bits/stdc++.h> template <class Int>
inline Int sqr(const Int &num) {
return num * num;
} template <class Int>
inline Int min(const Int &a, const Int &b) {
return a < b ? a : b;
} const int maxn = ; int n;
int cas;
int len;
int x[maxn];
int y[maxn];
int s[maxn];
int r[maxn]; inline int calc1(int mid) {
int left = (mid - + n) % n;
int right = (mid + + n) % n;
return
(x[left] - x[mid]) * (y[mid] - y[right])
- (y[left] - y[mid]) * (x[mid] - x[right]);
} inline int calc2(int left) {
int right = (left + + n) % n;
return
sqr(x[left] - x[right])
+ sqr(y[left] - y[right]);
} signed main(void) {
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = ; i < n; ++i)
scanf("%d%d", x + i, y + i);
memset(s, , sizeof(s));
for (int i = ; i < n; ++i) {
s[i << ] = calc1(i);
s[i << | ] = calc2(i);
}
len = n << ;
for (int i = ; i < n; ++i)
s[len + i] = s[i];
len = n << ;
int maxi = , id = , answer = ;
for (int i = ; i < len; ++i) {
if (maxi > i)
r[i] = min(r[*id - i], maxi - i);
else
r[i] = ;
while (i - r[i] >= && i + r[i] <= len
&& s[i - r[i]] == s[i + r[i]])++r[i];
if (maxi < i + r[i])
maxi = i + r[i], id = i;
if (r[i] > n)++answer;
}
printf("%d\n", answer);
}
}
BZOJ_1100.cpp
@Author: YouSiki
BZOJ 1100: [POI2007]对称轴osi的更多相关文章
- bzoj 1100 [POI2007]对称轴osi manacher
[POI2007]对称轴osi Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 771 Solved: 307[Submit][Status][Dis ...
- bzoj 1100: [POI2007]对称轴osi 思维
特别神的一道题. 有一句话要反复揣摩:题中给的所有点构成一个多边形!! 而且读入还是按照多边形的轮廓读进来的!!! 我们知道,如果对称轴确定的话判定条件是对应角相等且对应边相等. 所以把相邻边夹角和边 ...
- 【BZOJ】1100: [POI2007]对称轴osi
题意 给一个\(n(1 \le n \le 100000)\)个点不自交的多边形,求对称轴数目. 分析 将多边形表示成长度和角的形式(用有向面积来表示角也行),然后匹配. 题解 匹配可以用kmp或ma ...
- BZOJ1100 : [POI2007]对称轴osi
将多边形转化为如下的环: 1到2的边,角2,2到3的边,角3,...,n-1到n的边,角n,n到1的边,角1 然后枚举对称轴,如果i是对称轴,那么[i-n,i+n]是一个回文串 用Manacher算法 ...
- [POI2007]对称轴osi
Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大 ...
- BZOJ_1100_[POI2007]对称轴osi_KMP+计算几何
BZOJ_1100_[POI2007]对称轴osi_KMP+计算几何 Description FGD小朋友——一个闻名遐迩的年轻数学家——有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他 ...
- 树状数组 - BZOJ 1103 [POI2007]大都市
bzoj 1103 [POI2007]大都市 描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员 Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景. ...
- 并查集 - BZOJ 1104 [POI2007]洪水
BZOJ 1104 [POI2007]洪水 描述 AKD 市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD 市全被水淹没了.Blue Mary,AKD 市的市长,召集了他的所有顾问(包括你 ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
随机推荐
- PAT 1016. 部分A+B (15)
正整数A的"DA(为1位整数)部分"定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的"6部分"PA是66,因为A中有 ...
- php中Jpgraph的运用
用Jpgraph,只要了解它的一些内置函数,可以轻松得画出折线图.柱形图.饼状图等图表. 首先要保证PHP打开了Gd2的扩展: 打开PHP.ini,定位到extension=php_gd2.dll,把 ...
- CentOS搭建socket5代理服务器
1.安装socket5依赖包 yum -y install gcc automake make pam-devel openldap-devel cyrus-sasl-devel 2.下载ss5并 ...
- [LINK]Scribe
http://www.361way.com/scribe-chukwa-kafka-flume/4119.html
- Word中的字体大小
Word中的字体大小(几号-几磅) Word对字体大小采用两种不同的度量单位,其中一种是以"号"为度量单位,如常用的"初号.小初.一号.小一--七号.八号" ...
- LeetCode:Minimum Depth of Binary Tree,Maximum Depth of Binary Tree
LeetCode:Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth ...
- C语言复习(1)
test.c #include <stdio.h> int main(){ printf("hello\n"); return 0; } 1.预处理阶段 由于在test ...
- ASP.NT运行原理和页面生命周期详解及其应用
ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用. ...
- 【跟着子迟品underscore】从用 `void 0` 代替 `undefined` 说起
Why underscore 最近开始看 underscore源码,并将 underscore源码解读 放在了我的 2016计划 中. 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多 ...
- 知乎UWP 预览
又是很久都没有写博客了,为了表达歉意,奉上一个新的App,O(∩_∩)O! 因为商店的知乎太多了,然而,,所以一直打算自己动手写一个. 近段时间有些假期加上课程不是很忙,抽时间写了这个知乎.商店链接 ...