今日学习记录
1. 坐标变换csp.31.2
关键词:前缀和 模拟
问题分析:
- 就是有成倍数增长和转角度变换,只不过要操作 i~k 次
核心思路
- 其实不难,主要循环点不就在范围操作上吗,对于范围操作应该很熟悉,就是前缀和,可以看到,角度变换是累加变化,而成倍增长是累乘,两者不能混合在一起,但是可以分开计算,所以前缀和可以包含两个状态
- 计算累加和
- 计算累积 这题算简单是因为还没有考到乘法逆元的知识 累积好计算,但是这个累加不好算啊,
**最终代码:
#include<iostream>
#include<math.h>
#include<vector>
#include<cstdio>
using namespace std;
int n,m;
int main(){
scanf("%d %d",&n,&m);
vector<double> pre_c(n+1);
pre_c[0] = 1;
vector<double> pre_j(n+1);
for(int i = 1;i<=n;i++){
int a;double b;scanf("%d %lf",&a,&b);
if(a==1) pre_c[i] = pre_c[i-1]*b,pre_j[i] = pre_j[i-1];
if(a==2) pre_j[i] = pre_j[i-1]+b,pre_c[i] = pre_c[i-1];
}
while(m--){
int l,r,X,Y;scanf("%d %d %d %d",&l,&r,&X,&Y);
double k = pre_c[r]/pre_c[l-1];
double p = pre_j[r] - pre_j[l-1];
double x = k*X;
double y = k*Y;
printf("%.3f %.3f",x*cos(p)-y*sin(p),x*sin(p)+y*cos(p));
printf("\n");
}
return 0;
}学到的点:
- 前缀和