5017. 拍苍蝇

题目大意

给定一个平面坐标系,其中有 n 个整点。给定一个多边形,求在给定范围内,有多少个位置可以放这个多边形,满足多边形内没有给定的整点。

Data Constraint
1Xp,Yp500,nXpYp

题解

先用射线法做出一个bitset矩阵,记录那些点在多边形内。
然后原图建一个bitset,枚举多边形左下角的位置,暴力bitset and一下。

时间复杂度: O(Xp432)

SRC

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<cmath>
using namespace std ;

#define N 250000 + 10
#define M 500 + 10
struct DOT {
    int x , y ;
    DOT ( int X = 0 , int Y = 0 ) { x = X , y = Y ; }
} fly[N] , P[N] ;

bitset < M > Map[M] , POL[M] , tmp ;

bool flag[M][M] ;
int S[M][M] ;
int Xp , Yp , n , Num , ans ;
int Minx , Miny , Maxx , Maxy ;

int main() {
    freopen( "fly.in" , "r" , stdin ) ;
    freopen( "fly.out" , "w" , stdout ) ;
    scanf( "%d%d%d" , &Xp , &Yp , &n ) ;
    for (int i = 1 ; i <= n ; i ++ ) {
        scanf( "%d%d" , &fly[i].x , &fly[i].y ) ;
        Map[fly[i].x][fly[i].y] = 1 ;
    }
    Minx = Miny = 0x7FFFFFFF ;
    Maxx = Maxy = -0x7FFFFFFF ;
    scanf( "%d" , &Num ) ;
    for (int i = 1 ; i <= Num ; i ++ ) {
        scanf( "%d%d" , &P[i].x , &P[i].y ) ;
        Minx = min( Minx , P[i].x ) ;
        Miny = min( Miny , P[i].y ) ;
    }
    for (int i = 1 ; i <= Num ; i ++ ) {
        P[i].x -= Minx ;
        P[i].y -= Miny ;
        Maxx = max( Maxx , P[i].x ) ;
        Maxy = max( Maxy , P[i].y ) ;
    }
    for (int k = 1 ; k <= Num ; k ++ ) {
        int i = k , j = k % Num + 1 ;
        if ( P[i].x > P[j].x ) swap( i , j ) ;
        if ( P[i].x == P[j].x ) {
            for (int l = min( P[i].y , P[j].y ) ; l <= max( P[j].y , P[i].y ) ; l ++ ) flag[P[i].x][l] = -1 ;
            continue ;
        }
        double del = (double)(P[j].y - P[i].y) / (P[j].x - P[i].x) ;
        double y = P[i].y ;
        for (int l = P[i].x ; l <= P[j].x ; l ++ , y += del ) {
            int now = y ;
            if ( fabs(y-(double)now) <= 1e-6 ) flag[l][now] = 1 ;
            if ( l < P[j].x ) S[l][now+1] ++ ;
        }
    }
    for (int x = 0 ; x <= Maxx ; x ++ ) {
        for (int y = 1 ; y <= Maxy ; y ++ ) S[x][y] += S[x][y-1] ;
    }
    for (int x = 0 ; x <= Maxx ; x ++ ) {
        for (int y = 0 ; y <= Maxy ; y ++ ) {
            if ( flag[x][y] || (S[x][y] & 1) ) {
                POL[x][y] = 1 ;
            }
        }
    }
    for (int x = 0 ; x <= Xp - Maxx ; x ++ ) {
        for (int y = 0 ; y <= Yp - Maxy ; y ++ ) {
            bool ok = 1 ;
            for (int i = 0 ; i <= Maxx ; i ++ ) {
                tmp = POL[i] & (Map[x+i] >> y) ;
                if ( tmp.any() ) { ok = 0 ; break ; }
            }
            ans += ok ;
        }
    }
    printf( "%d\n" , ans ) ;
    return 0 ;
}

以上.

内容概要:本文详细介绍了PMSM(永磁同步电机)的仿真研究及其两种关键控制方法:三电平SVPWM矢量控制和双环矢量控制。首先阐述了PMSM在现代电机驱动系统中的重要地位及其广泛的应用领域,如电动汽车、机器人和风力发电等。接着讨论了PMSM仿真的重要性,包括电气特性、机械特性和热特性等方面的考量。然后深入探讨了三电平SVPWM矢量控制技术的工作原理及其对电机性能的提升效果,如提高运行效率和减少谐波失真。随后介绍了PMSM双环矢量控制的具体实现方式,即内环电流控制和外环速度控制相结合的方法,强调了这种方法在提高电机动态性能和稳定性方面的优势。最后对比了传统三电平控制方法和双环矢量控制方法的特点,指出了各自的优势和应用场景。 适合人群:从事电机控制系统研究的技术人员、高校相关专业师生、对电机控制感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解PMSM控制技术和仿真实现的研究项目和技术开发。目标是帮助读者掌握PMSM的仿真建模方法,理解并应用三电平SVPWM和双环矢量控制技术,以优化电机性能。 其他说明:本文不仅提供了理论分析,还通过MATLAB进行了详细的仿真演示,使读者能够直观地看到不同控制方法的效果。这对于实际工程项目的设计和优化具有重要的指导意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值