首页 > 其他分享 >[POI2007] OSI-Axes of Symmetry 题解

[POI2007] OSI-Axes of Symmetry 题解

时间:2024-07-30 18:51:11浏览次数:7  
标签:int 题解 POI2007 namespace long OSI Aurora define

给出一个多边形,求对称轴数量。

考虑对于一个多边形,其是对称的当且仅当对于若干个边(角),其左右的角与边都是对称的。

考虑如果我们对于内角构造出一种单射,映射为一个整数,将边映射为它的边长,那么我们按照角,边,角,边,……的顺序将他们加入数组中,能构造出一个长度为 \(2n\) 的数组,将这个数组复制一倍,则这个多边形的对称轴数目则为数组的长度为 \(2n+1\) 的回文串的个数的一半。这个可以很简单的用 \(\text{hash,KMP,manacher}\) 求出。

接下来我们考虑如何构造这个单射。题解区大部分用叉乘的方法都能被平行四边形卡掉,我们同时使用点乘和叉乘求出角的 \(\cos\) 和 \(\sin\),这个角的映射值就是 \(1e6 \times (10 \sin + \cos)\)。这样就保证了这是一个单射。

#include<bits/stdc++.h>
using namespace std;
namespace Aurora{ void Main(); }
int main(){ return Aurora::Main(),0; }
namespace Aurora{
    #define ll long long
    #define int long long
    #define debug printf("debug\n")
    const int N=2e5+5,base=1e9+9,mod=1e9+7;
    int T,n,b[N<<2],h1[N<<2],h2[N<<2],p[N<<2];
    struct poi{
        int x,y;
    }a[N];
    int Dis(int i,int j){
        return (a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
    }
    int Rag(int i,int j,int k){
        poi A={a[i].x-a[j].x,a[i].y-a[j].y};
        poi B={a[k].x-a[j].x,a[k].y-a[j].y};
        double sn=(A.x*B.y-A.y*B.x)*1.0/(1.0*sqrt(Dis(i,j))*sqrt(Dis(j,k)));
        double cn=(A.x*B.x+A.y*B.y)*1.0/(1.0*sqrt(Dis(i,j))*sqrt(Dis(j,k)));
        double Mjj=(sn*10+cn)*10000;
        int res=Mjj;
        res=(res%mod+mod)%mod;
        return res;
    }
    int Q1(int x,int y){
        return (h1[y]-h1[x-1]*p[y-x+1]%mod+mod)%mod;
    }
    int Q2(int x,int y){
        return (h2[x]-h2[y+1]*p[y-x+1]%mod+mod)%mod;
    }
    void Main(){
        scanf("%lld",&T);
        p[0]=1;
        for(int i=1;i<=N*4-5;i++) p[i]=p[i-1]*base%mod;
        while(T--){
            memset(h1,0,sizeof(h1));
            memset(h2,0,sizeof(h2));
            scanf("%lld",&n);
            for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
            a[0]=a[n],a[n+1]=a[1];
            for(int i=1;i<=n;i++){
                b[i*2-1]=Dis(i-1,i);
                b[i*2]=Rag(i-1,i,i+1);
            }
            // for(int i=1;i<=n*2;i++) printf("%lld ",b[i]);
            // puts("");
            for(int i=1;i<=n*2;i++) b[i+n*2]=b[i];
            // for(int i=1;i<=n*4;i++) printf("%lld ",b[i]);
            // puts("");
            for(int i=1;i<=n*4;i++) h1[i]=(h1[i-1]*base+b[i])%mod;
            for(int i=n*4;i>=1;i--) h2[i]=(h2[i+1]*base+b[i])%mod;
            int ans=0;
            for(int i=1;i<=n*2;i++){
                // printf("ID:%lld H1:%lld H2:%lld \n",i,Q1(i,i+n*2),Q2(i,i+n*2));
                if(Q1(i,i+n*2)==Q2(i,i+n*2)){
                    // printf("%lld ",i);
                    ans++;
                }
            }
            // puts("");
            printf("%lld\n",ans/2);
        }        
    }
}

标签:int,题解,POI2007,namespace,long,OSI,Aurora,define
From: https://www.cnblogs.com/Aurora-Borealis-Not-Found/p/18333130

相关文章

  • 旅行 题解
    题目id:20300题目描述鱼大大计划环华夏自驾游游玩一圈,在他的计划中,这次旅行将在\(m\)天内完成,预计游玩\(n\)个城市,每个城市游玩\(x\)天,然后赶路开车以均速去到下一个城市,现鱼大大从海洋城市出发,按游玩顺序先后给出每个城市和上一个城市之间的距离(\(km\)),问鱼大大每天至少赶路多......
  • 质数差列 题解
    题目id:20315题目描述驰骋宇宙的鱼大大找到了一个古遗迹,稍作研究后发现这是一个来着远古的质数星球文明遗迹,这个文明的特点是所有事物都和质数息息相关。于是,鱼大大赶紧列出了一堆的质数,以方便自己的研究。这天鱼大大找到了质数星球文明的一个遗迹仓库大门,正准备破解密码的同时......
  • [POI2008] POC-Trains 题解
    前言题目链接:洛谷。时间复杂度和输入同阶的做法。题意简述有\(n\)(\(n\leq10^3\))个长\(m\)的字符串,\(q\)(\(q\leq10^5\))次操作,交换两个字符串的两个字符。问每个字符串在所有时刻,最多有几个和它相等。题目分析套路做法看到字符串相等,想到使用哈希。但是要支持修改,怎么......
  • Exhaust Aftertreatment Diagnosis for Cummins Diesel Engines
    ToperformexhaustaftertreatmentdiagnosisonCumminsenginesusingCumminsInsite,youwillneedtousespecializedsoftwaretodiagnoseandtroubleshootissuesrelatedtotheexhaustaftertreatmentsystem.Theexhaustaftertreatmentsystemincludescom......
  • 题解:[ABC363D] Palindromic Number
    提示特定位数的回文数数量是可以快速计算出来的,对于特定的位数\(n\),第一位由于不能有前导\(0\),共有\(9\)种选择,而从第\(2\)位到第\(\frac{n+1}{2}\)位都有\(10\)种选择(一个回文数完全由它的前半部分确定)。所以\(n\)位数中共有\(S(n)=9*10^\frac{n-1}{2}......
  • P3811 【模板】模意义下的乘法逆元 题解
    【模板】模意义下的乘法逆元题目背景这是一道模板题题目描述给定n,pn,pn,p求......
  • UCOSIII的中断和时间管理
    前言UCOSIII(也称为µC/OS-III)的中断管理是其实时操作系统(RTOS)功能的重要组成部分。中断是CPU的一种常见特性,用于向CPU通知异步事件的发生,使得CPU能够暂停当前正在执行的程序,转而执行中断服务程序(ISR)。在UCOSIII中,中断管理涉及多个方面,包括中断嵌套、中断服务程序的编写、临界......
  • 题解:Codeforces Round 962 (Div. 3) D
    D.Funtimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputCountingisFun!—satyam343Giventwointegers\(n\)and\(x\),findthenumberoftriplets(\(a,b,c\))ofpositiveintegerss......
  • [USACO1.5] 八皇后 Checker Challenge 题解
    [USACO1.5]八皇后CheckerChallenge题目描述一个如下的\(6\times6\)的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列\(2\4\6\1\3\5\)来描述,第\(i\)个数字表示在......
  • 题解:P10815 【模板】快速读入
    闲着没事儿水篇tj题目大意题目大意极其粗暴,记得\(10^8\times10^8=10^{16}>2^{31}-1\)会爆int,开longlong就好。于是这个题就变成了一个读入输出优化模板题。这不又回去了。另外,输入输出常数优化也很常用,抢最优解和骗分时都可以用上。1cin/cout版本操作ios::......