题目:
![](https://i-blog.csdnimg.cn/blog_migrate/160ce6296954a795e5d94d4a4f1ca6b9.png)
关键是要想到Ai+...+Aj=SUMj-SUMi-1。第i项加到第j项等于前j项的和减去前i-1项的和。
代码:
#include<bits/stdc++.h>
using namespace std;
#define PI 3.14159265358
const int N = 100010;
struct Act{
int type;
double d;
}act[N];
double product[N];//前n项拉伸系数乘积
double sum[N];//前n项旋转角度和
void out(int i, int j, double x, double y){
//product[j]/product[i-1]表示i到j项拉伸系数乘积
x = x*product[j]/product[i-1];
y = y*product[j]/product[i-1];
//temp表示i到j项旋转角度和
double temp = sum[j] - sum[i-1];
double x0 = x, y0=y;
x = x0*cos(temp) - y0*sin(temp);
y = x0*sin(temp) + y0*cos(temp);
printf("%f", x);cout<<' ';printf("%f", y);//cout<<endl;
}
int main(){
product[0] = 1.0, sum[0] = 0;
int n, m;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>act[i].type>>act[i].d;
if(act[i].type==1){
product[i]=product[i-1]*act[i].d;
sum[i]=sum[i-1];
}
else{
product[i]=product[i-1];
sum[i]=sum[i-1]+act[i].d;
}
}
int i, j;double x, y;
for(int k=0;k<m;k++){
if(k>0) cout<<endl;
cin>>i>>j>>x>>y;
out(i, j, x, y);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/fd7eadfa75cc5e828fa5091096294d73.png)