题意:给一个 nnn 个点的多边形,求对称轴个数。

n≤105n\leq 10^5n≤105

显然对称轴一定在顶点或边的中点上。

但你 n2n^2n2 枚举完全没有一点能过的样子。

冷静分析,发现有 “中点”,“对称轴”,很自然个鬼地想到了manacher。

在边的中点插入一个点,然后复制一遍断环成链。 然后跑马拉车,扩展的时候判断是否轴对称。

设点 iii 可以扩展到 [i−pi,i+pi][i-p_i,i+p_i][i−pi​,i+pi​],如果扩展到整个多边形就是合法的对称轴,即 2pi+1≥2n2p_i+1\geq 2n2pi​+1≥2n,pi≥np_i\geq npi​≥n,并且只有第一圈的点会有贡献。一个对称轴会算两次,除以 222 就是答案。

方便实现的小trick:

  1. 边界的地方随机一个点就不用特判。
  2. 判轴对称可以算出中点,用叉积判在不在已知的对称轴上。如果对称轴未确定就设成 000 向量。但要注意本来就确定的时候要特判一下不要把它改回零向量。
  3. 读入的坐标都乘上 444,就可以不用 double。

复杂度 O(n)O(n)O(n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#define MAXN 400005
using namespace std;
inline int read()
{int ans=0,f=1;char c=getchar();while (!isdigit(c)) (c=='-')&&(f=-1),c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return f*ans;
}
typedef long long ll;
int x[MAXN],y[MAXN];
int p[MAXN],maxr,mid,cnt;
int lasx,lasy;
inline bool check(int l,int i,int r)
{if ((ll)(x[l]-x[i])*(x[l]-x[i])+(ll)(y[l]-y[i])*(y[l]-y[i])!=(ll)(x[r]-x[i])*(x[r]-x[i])+(ll)(y[r]-y[i])*(y[r]-y[i]))return false;int tx=(x[l]+x[r])/2-x[i],ty=(y[l]+y[r])/2-y[i];if ((ll)tx*lasy!=(ll)ty*lasx) return false;if ((ll)tx*tx+(ll)ty*ty) lasx=tx,lasy=ty;return true;
}
int main()
{for (int T=read();T;T--){int n=read();for (int i=1;i<=2*n;i+=2) x[i]=read()*4,y[i]=read()*4;for (int i=2*n+1;i<=4*n;i+=2) x[i]=x[i-2*n],y[i]=y[i-2*n];x[4*n+1]=x[1],y[4*n+1]=y[1];for (int i=2;i<=4*n;i+=2) x[i]=(x[i-1]+x[i+1])/2,y[i]=(y[i-1]+y[i+1])/2;x[0]=rand(),y[0]=rand(),x[4*n+1]=rand(),y[4*n+1]=rand();maxr=mid=cnt=0;for (int i=1;i<=4*n;i++){if (i<maxr) p[i]=min(p[2*mid-i],maxr-i);else p[i]=0;lasx=lasy=0;while (check(i-p[i]-1,i,i+p[i]+1)) ++p[i];if (i+p[i]>maxr) maxr=i+p[i],mid=i;cnt+=(p[i]>=n);}printf("%d\n",cnt/2);}return 0;
}

【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】相关推荐

  1. 2011年全国大学生程序设计邀请赛(福州)

    题号 题目 考点 难度 A Password table 模拟 签到 B Axial symmetry 计算几何 代码题 C Log Calculator java大数 D Maximum Value ...

  2. 晶体结构与对称群Lecture3

    晶体结构如对称群Lecture3 Point symmetry operations and point groups Point symmetry elements and the matrix e ...

  3. 计算几何及其应用——计算几何基础

    写在前面:当时开计算几何这个专题神奇的从解析几何开始了,然后最近发现<计算几何及应用(金博)>这本书前面那章忽略掉了一些重要的东西比如说点定位.半平面相交之类的东西,恰好还有一些和计算几何 ...

  4. python 计算面积 比计算几何慢_利用ArcGIS和Python计算中国各省路网密度

    ArcGIS 相交 利用ArcGIS里面的相交工具,每个省把路标识了. 计算几何 分别计算路网的长度和各省的面积. Python 利用Python对属性数据进行处理 导入相关模块 ## 导入相关模块 ...

  5. manacher算法----O(n)最长回文串

    manacher算法----O(n)最长回文串 分类:字符串 (126)  (0)  举报  收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...

  6. 「linux网络管理」OSI模型

    学习linux网络管理,笔记整理,促进记忆. OSI(开放系统互联模型)包含七层,由应用层向物理层递进,分别有不同的协议和数据处理方式. 应用层--> 表示层--> 会话层--> 传 ...

  7. TCP/IP四层模型和OSI七层模型

    TCP/IP四层模型和OSI七层模型对应表.我们把OSI七层网络模型和Linux TCP/IP四层概念模型对应,然后将各种网络协议归类.     表1-1  TCP/IP四层模型和OSI七层模型对应表 ...

  8. OSI[七层]与TCP/IP[四层]模型简述简图

    OSI参考模型(OSI/RM)的全称是开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它是由国际标准化组织(Interna ...

  9. 计算机网络7层协议模型,计算机网络(一) OSI七层模型及TCP/IP dubbo协议

    3.TCP/IP 四层模型: TCP/IP协议:是一个网络通信模型,是OSI 七层模型的简化,为4层模型,泛指众多(TCP,UDP,IP等)协议: OSI TCP/IP 功能 协议 应用层 应用层 文 ...

最新文章

  1. c语言中floox的头文件,PC-1211袖珍计算机在合成氨厂生产中的应用 第五讲 循环语句(FOR-NEXT语句)...
  2. ubuntu mysql 改密码_tpcc-mysql 压力测试
  3. oracle之分析函数 开窗函数,Oracle之分析函数、开窗函数
  4. word在线解密_实用技能 | 5款免费在线转换PDF的网站
  5. 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
  6. 机器学习笔记 invariance data augmentation
  7. delete 字符数组 []_前端基础扫盲系列 长达8000字的数组总结
  8. 玩转android studio,玩转AndroidStudioIDE
  9. Java中Filter的理解
  10. php 预览器,浏览器html代码快速预览小工具
  11. 一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
  12. 协鑫集成携中国成套工程在核灾区建立1GW光伏电站
  13. vscode python debug venv_Visual Studio Code Python开发调试环境设置
  14. TensorFlow精进之路(一):Softmax回归模型训练MNIST
  15. 教你如何做到显示 Dialog Box(对话框)
  16. 架构 全局负载均衡与CDN网络简介
  17. js怎么实现ftp上传文件到服务器上,js ftp上传文件到服务器上
  18. 计算机辅助翻译与人工智能,2018年机器翻译行业概述与现状,人工智能让人人实现国际化交流...
  19. [《所遇随心》偶感小记]2012年8月28日
  20. java计算两个时间为天数_java计算两个时间相差天数的方法汇总

热门文章

  1. php反转数字_【PHP】php实现数组反转
  2. 战队口号霸气押韵8字_高考励志班级口号霸气押韵大全
  3. 天冷打字全靠抖?!桌面暖手宝,体验10s速热,温暖升级,冬天有TA就够了
  4. 天体运行动图,如此美妙,如此震撼!
  5. 雷军:有人说我写的代码像诗一样优雅~
  6. 这哥们到底是应聘的还是来收购公司的?| 今日趣图
  7. 计算机广告制作未来发展还行吗,计算机多媒体设计专业和广告设计制作那个好...
  8. jdbc连接mysql的语法_JDBC连接MySQL
  9. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  10. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...