AIM Tech Round 5 (rated, Div. 1 + Div. 2)F. Make Symmetrical(结论+暴力)

博客围绕无限大二维平面上的点操作展开,包括加点、删点及询问以原点和某点连线为对称轴时使平面对称需添加的最少点数。分析时猜测圆上整点不多,根据对称点到原点距离相等的特性进行操作,最后给出代码实现。

题意

  给一个无限大的二维平面,n(n2105)n(n≤2∗105)次操作,(1)在平面上加一个点(保证加入前不存在),(2)在平面上删除一个点(保证删除时存在),(3)给出一个点,以原点和这个点连成的直线为对称轴,问你至少要加几个点可以使得这个平面对称。

分析

  首先我们猜一个结论,就是一个以原点为圆心的圆上的整点是不会很多的(具体我不会证)。然后又因为如果这个平面对称,那么两个对称点到原点的距离肯定是相等的。那么我们每次加入或删除一个点时,记这个点到原点的距离为dd,那我们暴力枚举这个以d为半径,原点为圆心的圆上其他的点,算出他们的对称轴,把这个对称轴的数值加上或减去2,然后把这个点和原点连成的直线所形成的对称轴的数值加上或减去1,之后每次O(1)回答答案就行了。

Code

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
struct Point {
    int x,y;
    Point(int _x=0,int _y=0) {
        x=_x,y=_y;
    }
    inline bool operator < (const Point &rhs) const {
        return x==rhs.x?y<rhs.y:x<rhs.x;
    }
    inline Point F() {
        Point p=Point(x,y);
        if(x||y) {
            int g=__gcd(p.x,p.y);
            p.x/=g,p.y/=g;
        }
        return p;
    }
    inline Point operator + (const Point &rhs) const {
        return Point(x+rhs.x,y+rhs.y).F();
    }
};
int n,cnt;
map<ll,set<Point> >circle;
map<Point,int>exist;
Point o(0,0);
int main() {
    read(n);
    while(n--) {
        int ty,x,y;
        read(ty),read(x),read(y);
        Point t=Point(x,y);
        ll d=1ll*x*x+1ll*y*y;
        if(ty==1) {
            for(auto p:circle[d])
                exist[p+t]+=2;
            circle[d].insert(t);
            exist[o+t]++,cnt++;
        }
        if(ty==2) {
            circle[d].erase(circle[d].find(t));
            for(auto p:circle[d])
                exist[p+t]-=2;
            exist[o+t]--,cnt--;
        }
        if(ty==3)
            printf("%d\n",cnt-exist[o+t]);
    }
}
### 回答1: STM32F407VET6是一款ARM Cortex-M4内核的32位微控制器。在这个压缩包中可能包含了与STM32F407VET6的互补SPWM驱动、死区处理、PID算法、ADC和TFT LCD显示有关的代码和文档。 互补SPWM(Symmetrical Pulse Width Modulation)是一种PWM技术,通常用于驱动三相交流电机。它通过控制三相电机各个绕组上的电流交替切换,实现电机的转动控制。 死区是为了避免晶闸管或MOS管等电子开关元件在高频率PWM输出过程中出现两个开关同时导通的情况。死区的设计能够确保高频率PWM正常输出,提高系统的可靠性。 PID(Proportional-Integral-Derivative)是一种常用的控制算法,常用于控制系统中。它基于误差的比例、积分、微分,并结合前几次的控制效果作为修正,实现控制系统的准确控制。 ADC(Analog to Digital Converter)是模数转换器,可以实现将模拟信号转换为数字信号,从而方便处理和处理。 TFT LCD(Thin Film Transistor Liquid Crystal Display)是一种液晶显示屏技术,广泛应用于各种电子设备中。它具有高分辨率、高色彩饱和度和广视角等优点,适用于多种应用场景。 通过这个压缩包,我们可以获取到STM32F407VET6的互补SPWM驱动相关的代码和文档,了解如何实现高效的电机控制。同时,死区处理的代码和文档可以帮助我们避免开关元件导通问题,提高系统的可靠性。PID算法的代码和文档可以用于控制系统的准确控制。ADC相关的代码和文档可以帮助我们了解如何将模拟信号转换为数字信号。最后,TFT LCD显示相关的代码和文档可以帮助我们实现在STM32F407VET6上显示各种图形和文字的功能。 ### 回答2: 首先,"stm32f407vet6"是一款由STMicroelectronics开发的32位微控制器。该控制器具有高性能和丰富的外设,被广泛应用于工业控制、嵌入式系统和数字信号处理等领域。 "互补SPWM"是一种用于交流电机驱动的技术,通过控制PWM信号的相位和占空比来实现对电机的速度和转向的控制。SPWM代表正弦脉宽调制,是一种常用的交流电机控制方法之一。 "死区"是在SPWM控制中的一个概念,用于防止电机驱动电路中的两个开关同时导通,产生短路。通过在两个开关之间插入一个时间间隔,称为死区,可以避免这种情况的发生。 "PID"是一种常用的控制算法,用于实现对系统的准确控制。PID代表比例(Proportional)、积分(Integral)和微分(Derivative),通过调整这三个参数可以实现系统的稳定和快速响应。 "ADC"是模拟到数字转换器的缩写,用于将模拟信号转换为数字信号,以便微控制器进行处理。通过ADC可以实现对外部传感器的读取和测量。 "TFT LCD"是薄膜晶体显示屏的一种类型,具有高分辨率、鲜艳的色彩和广视角等特点。通过控制器上的相应接口,可以实现图形和文本的显示。 "显示.zip"是指将以上所述实现互补SPWM、死区、PID、ADC和TFT LCD显示的相关源代码和工程文件打包压缩成.zip格式文件,方便传输和共享。 综上所述,“stm32f407vet6互补SPWM死区PID ADC TFT LCD显示.zip”可以理解为一个包含了上述功能的源代码和工程文件的压缩文件,这些功能通过STM32F407VET6微控制器实现了互补SPWM控制、死区保护、PID控制、ADC读取和TFT LCD显示等功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值