分析思路:当数据变多的适合,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;
}