题解-POI2007 OSI-Axes of Symmetry
Problem
题意概要:给定一个简单多边形(不一定凸),求其对称轴数量
数据组数\(\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的更多相关文章
- 开始做POI啦...
库 为了效率搞了这么一个库: 现在版本号1.14(一月十四日更新版本囧..) http://pan.baidu.com/s/1c0SoGfu [source] http://pan.baidu.com ...
- 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
1100: [POI2007]对称轴osi Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 630 Solved: 243[Submit][Statu ...
- 【BZOJ】1100: [POI2007]对称轴osi
题意 给一个\(n(1 \le n \le 100000)\)个点不自交的多边形,求对称轴数目. 分析 将多边形表示成长度和角的形式(用有向面积来表示角也行),然后匹配. 题解 匹配可以用kmp或ma ...
- BZOJ1101 & 洛谷3455:[POI2007]ZAP——题解
https://www.luogu.org/problemnew/show/3455#sub http://www.lydsy.com/JudgeOnline/problem.php?id=1101 ...
- [POI2007]对称轴osi
Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大 ...
- [POI2007]洪水pow 题解
[POI2007]洪水pow 时间限制: 5 Sec 内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...
- 题解 P3451 [POI2007]ATR-Tourist Attractions
题解 这里的做法是卡空间的做法,相比于滚动数组,这种做法因为没有三维数组寻址的大常数,所以较快. 在普通的做法中,\(dp[state][i]\) 表示以 \(i\) 结尾,那么 \(state\) ...
- BZOJ1103[POI2007]大都市meg 题解
题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...
随机推荐
- Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识
1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...
- Web API中使用CORS解决跨域
Web API中使用Cros解决跨域 如果两个页面的协议,端口和域名都相同,则两个页面具有相同的源,注:IE不考虑端口,同源策略不会阻止浏览器发送请求,但是它会阻止应用程序看到响应.如下图所示 COR ...
- Linux学习笔记:【000】Linux系统入门
什么是Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX(可移植操作系统接口 Portable Operating System Interface of UN ...
- Windows环境手动DOS命令构建apk文件
第一步 抽取资源id,生成R.java aapt p[ackage] -f [-A <assets>] -S <res> -M <AndroidManifest.xml& ...
- 通过WifI开发调试Android设备
前言:使用的windows系统,为了可以通过wifi可以直接连接android设备调试,尝试使用以下方法一.使用ADB USB to WIFI 一直不成功. 二.使用命令行方式 1.进入android ...
- build script和all projects作用和区别
buildscript中的声明是gradle脚本自身需要使用的资源.可以声明的资源包括依赖项.第三方插件.maven仓库地址等.而在build.gradle文件中直接声明的依赖项.仓库地址等信息是项目 ...
- 01.Redis 初体验
0. Redis安装 官网下载Redis 解压缩 make make install 安装后的执行命令被保存在了/usr/local/bin目录下 1. 配置文件:redis.conf daemoni ...
- Groovy 设计模式 -- 抽象工厂 模式
抽象工厂 https://blog.csdn.net/wyxhd2008/article/details/5597975 首先来看看这两者的定义区别: 工厂模式:定义一个用于创建对象的借口,让子类决定 ...
- GCC编译器原理(二)------编译原理一:目标文件
一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和 ...
- IDAPython学习(二)
1.常用函数 ScreenEA() 获取IDA调试窗口中,光标指向代码的地址.通过这个函数,我们就能够从一个已知的点运行我们的脚本. GetInputFileMD5() 返回IDA加载的二进制文件的M ...