ccf 202309 02

发布时间 2023-11-26 15:45:07作者: Fredddy
分析思路:当数据变多的适合,O(n方)的复杂度就不适合了
此时发现弧度可以累加,k可以累乘
考虑再开辟两个数组,分别存放从操作一到操作n的累乘、累加和
在使用时,就不需要再一遍遍加,只用让m_roof的减去或者除以m_ground即可
注意:!!!!下表的m_ground需要再减1,因为这个时候才相当于从m_ground操作到m_roof!!!! 
因为这个查好久
 
 
#include<iostream>
#include<math.h>
using namespace std;
const int N=100000;
int main()
{
    //n 操作 m 个数  
    double nx[N]={0},ny[N]={0};
    int m_ground[N]={0},m_roof[N]={0};
    int M_choose[N]={0};
    double M_data[N]={0};
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){cin>>M_choose[i]>>M_data[i];}
    for(int i=0;i<m;i++){cin>>m_ground[i]>>m_roof[i]>>nx[i]>>ny[i];}

    double sum_hudu[N]={0},sum_k[N]={1};
    for(int i=0;i<N;i++)sum_k[i]=1;
   
    for(int i=1;i<N;i++)//对第i个操作
    {
        if (M_choose[i]==1)
            {sum_k[i]=sum_k[i-1]*M_data[i];
            sum_hudu[i]=sum_hudu[i-1];
            }
        else
            {sum_hudu[i]=sum_hudu[i-1]+M_data[i];
            sum_k[i]=sum_k[i-1];
            }
    }

    for(int i=0;i<m;i++)
        {
            double temp=nx[i];
            nx[i]=nx[i]*cos(sum_hudu[m_roof[i]]-sum_hudu[m_ground[i]-1])-ny[i]*sin(sum_hudu[m_roof[i]]-sum_hudu[m_ground[i]-1]);
            ny[i]=ny[i]*cos(sum_hudu[m_roof[i]]-sum_hudu[m_ground[i]-1])+temp*sin(sum_hudu[m_roof[i]]-sum_hudu[m_ground[i]-1]);
           
            nx[i]=(sum_k[m_roof[i]]/sum_k[m_ground[i]-1])*nx[i];
            ny[i]=(sum_k[m_roof[i]]/sum_k[m_ground[i]-1])*ny[i];
        }

    for(int i=0;i<m;i++)
    {
        cout<<fixed<<nx[i]<<" "<<ny[i]<<endl;
    }
    return 0;
}