该第二题难度偏小,通过前缀和数组可以很容易求解。
不过要注意处理前缀和时,k是逐个相乘,θ是逐个相加。
且K[0]初始为1,C[0]初始为0.
#include<bits/stdc++.h>
using namespace std;
double K[100005]; //用于存储k的前缀和
double C[100005]; //用于存储θ的前缀和
int main()
{
int n,m;
cin>>n>>m;
K[0]=1; //初始为1
C[0]=0; //初始为0
for(int i=1;i<=n;i++)
{
int t;
double p;
cin>>t>>p;
K[i]=K[i-1]; //初始化第i个前缀和
C[i]=C[i-1];
if(t==1) K[i]*=p; //如果是k改变
else C[i]+=p; //如果是θ改变
}
for(int i=0;i<m;i++)
{
int a,b,x,y;
cin>>a>>b>>x>>y;
double k=K[b]/K[a-1]; //注意边界
double c=C[b]-C[a-1];
double xx=x*k;
double yy=y*k;
double mx=xx*cos(c)-yy*sin(c);
double my=xx*sin(c)+yy*cos(c);
cout<<fixed<<setprecision(3)<<mx<<' '<<my<<endl; //输出保留三位小数方便检查
}
return 0;
}