Problem

bzoj1100

题意概要:给定一个简单多边形(不一定凸),求其对称轴数量

数据组数\(\leq 10\),多边形点数\(\leq 10^5\)

Solution

这题算是跨界算法的经jian典dan题目了吧

观察多边形对称的性质,容易发现其本质就是沿着对称轴翻折可以使多边形重合,即两侧一致

进一步发现所有边长和角度相等,可证如果给定固定的角度和边长,只能得到一种图形,所以一旦某点或某边两侧的边长角度对应相等,则一定存在一条对称轴穿过该点或该边

为了快速地得到对应相等的边和角,可以采用按照多边形的输入顺序将边角混合放进序列跑manacher,处理环的话倍增序列即可

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; inline void read(int&x){
char c11=getchar(),ob=0;x=0;
while(c11^'-'&&!isdigit(c11))c11=getchar();if(c11=='-')ob=1,c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();if(ob)x=-x;
} const int N=1001000;
const double eps=1e-8; struct vec{
int x,y;
inline vec(){}
inline vec(const int&X,const int&Y):x(X),y(Y){}
inline void in(){read(x),read(y);}
friend inline vec operator - (const vec&A,const vec&B) {return vec(A.x-B.x,A.y-B.y);}
friend inline ll operator * (const vec&A,const vec&B) {return (ll)A.x*B.y-(ll)A.y*B.x;}
inline double len(){return sqrt((ll)x*x+(ll)y*y);}
}p[N]; struct node{
int sgn;double v;
inline node(){}
inline node(const int&SGN,const double&V):sgn(SGN),v(V){}
friend inline bool operator == (const node&A,const node&B)
{return A.sgn==B.sgn and fabs(A.v-B.v)<eps;}
}t[N]; inline double angle(vec A,vec B,vec C){C=C-B,B=B-A;return 1.0*(B*C)/B.len()/C.len();} int n,f[N],e; void init(){
read(n);
for(int i=1;i<=n;++i)p[i].in();
p[0]=p[n],p[n+1]=p[1];
e=0;
for(int i=1;i<=n;++i){
t[++e]=node(0,0);
t[++e]=node(1,angle(p[i-1],p[i],p[i+1]));
t[++e]=node(0,0);
t[++e]=node(2,(p[i+1]-p[i]).len());
}
for(int i=1;i<=e;++i)t[i+e]=t[i];
t[e=e<<1|1]=node(0,0);
} void work(){
int R=0,ps=0,ans=0;
for(int i=0;i<=e;++i)f[i]=0;
for(int i=1;i<=e;++i){
if(i<R)f[i]=min(f[ps+ps-i],R-i);
else f[i]=1;
while(f[i]<i and i+f[i]<=e and t[i+f[i]]==t[i-f[i]])
++f[i];
if(i+f[i]>R)ps=i,R=i+f[i];
if(f[i]-1>=n+n)++ans;
}
printf("%d\n",ans>>1);
} int main(){
int T;read(T);
while(T--)init(),work();
return 0;
}

题解-POI2007 OSI-Axes of Symmetry的更多相关文章

  1. 开始做POI啦...

    库 为了效率搞了这么一个库: 现在版本号1.14(一月十四日更新版本囧..) http://pan.baidu.com/s/1c0SoGfu [source] http://pan.baidu.com ...

  2. bzoj 1100 [POI2007]对称轴osi manacher

    [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 771  Solved: 307[Submit][Status][Dis ...

  3. BZOJ 1100: [POI2007]对称轴osi

    1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Statu ...

  4. 【BZOJ】1100: [POI2007]对称轴osi

    题意 给一个\(n(1 \le n \le 100000)\)个点不自交的多边形,求对称轴数目. 分析 将多边形表示成长度和角的形式(用有向面积来表示角也行),然后匹配. 题解 匹配可以用kmp或ma ...

  5. BZOJ1101 & 洛谷3455:[POI2007]ZAP——题解

    https://www.luogu.org/problemnew/show/3455#sub http://www.lydsy.com/JudgeOnline/problem.php?id=1101 ...

  6. [POI2007]对称轴osi

    Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大 ...

  7. [POI2007]洪水pow 题解

    [POI2007]洪水pow 时间限制: 5 Sec  内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...

  8. 题解 P3451 [POI2007]ATR-Tourist Attractions

    题解 这里的做法是卡空间的做法,相比于滚动数组,这种做法因为没有三维数组寻址的大常数,所以较快. 在普通的做法中,\(dp[state][i]\) 表示以 \(i\) 结尾,那么 \(state\) ...

  9. BZOJ1103[POI2007]大都市meg 题解

    题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...

随机推荐

  1. Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识

    1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...

  2. Web API中使用CORS解决跨域

    Web API中使用Cros解决跨域 如果两个页面的协议,端口和域名都相同,则两个页面具有相同的源,注:IE不考虑端口,同源策略不会阻止浏览器发送请求,但是它会阻止应用程序看到响应.如下图所示 COR ...

  3. Linux学习笔记:【000】Linux系统入门

    什么是Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX(可移植操作系统接口 Portable Operating System Interface of UN ...

  4. Windows环境手动DOS命令构建apk文件

    第一步 抽取资源id,生成R.java aapt p[ackage] -f [-A <assets>] -S <res> -M <AndroidManifest.xml& ...

  5. 通过WifI开发调试Android设备

    前言:使用的windows系统,为了可以通过wifi可以直接连接android设备调试,尝试使用以下方法一.使用ADB USB to WIFI 一直不成功. 二.使用命令行方式 1.进入android ...

  6. build script和all projects作用和区别

    buildscript中的声明是gradle脚本自身需要使用的资源.可以声明的资源包括依赖项.第三方插件.maven仓库地址等.而在build.gradle文件中直接声明的依赖项.仓库地址等信息是项目 ...

  7. 01.Redis 初体验

    0. Redis安装 官网下载Redis 解压缩 make make install 安装后的执行命令被保存在了/usr/local/bin目录下 1. 配置文件:redis.conf daemoni ...

  8. Groovy 设计模式 -- 抽象工厂 模式

    抽象工厂 https://blog.csdn.net/wyxhd2008/article/details/5597975 首先来看看这两者的定义区别: 工厂模式:定义一个用于创建对象的借口,让子类决定 ...

  9. GCC编译器原理(二)------编译原理一:目标文件

    一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和 ...

  10. IDAPython学习(二)

    1.常用函数 ScreenEA() 获取IDA调试窗口中,光标指向代码的地址.通过这个函数,我们就能够从一个已知的点运行我们的脚本. GetInputFileMD5() 返回IDA加载的二进制文件的M ...