网站上传ftp,宁波网站制作网站,怎样利用云盘做电影网站,湖南人文科技学院图书馆坐标变换#xff08;其二#xff09;
首先我按照一般的逻辑写出来#xff0c;居然超时了#xff1f;#xff1f;#xff1f;
之后想了想#xff0c;还是觉得大有可为的#xff0c;对拉伸前缀积#xff0c;对旋转前缀和成功解决问题。
80分#xff1a;超时
#inclu…坐标变换其二
首先我按照一般的逻辑写出来居然超时了
之后想了想还是觉得大有可为的对拉伸前缀积对旋转前缀和成功解决问题。
80分超时
#include iostream
#include vector
#include cmath
using namespace std;
const int N1e5;struct Operate
{int op;double k;
};int n,m;
vectorOperateinst(N);void stretch(doublex,doubley,doublek)
{xk*x;yk*y;
}void rotate(doublex,doubley,doublek)
{//巨大坑点计算旋转结果时要避免纵坐标受到横坐标已经计算从而变化的影响 double tempxx; xx*cos(k)-y*sin(k);ytempx*sin(k)y*cos(k);
}int main()
{cinnm; //操作和查询次数Operate t;for(int i1;in;i){cint.opt.k;inst[i]t;}double x,y,l,r;while(m--){cinlrxy;for(int il;ir;i){ if(inst[i].op1)stretch(x,y,inst[i].k);else if(inst[i].op2)rotate(x,y,inst[i].k);}printf(%.3lf %.3lf\n,x,y);} return 0;} 改进策略我觉得伸缩是线性的变换可能通过类似前缀和的方式进行规整。比如说执行12345这五条指令其中135都是伸缩指令按理说我们一共需要执行五次。如果使用类似前缀和的想法我们只需要知道1、5这两次的前缀积然后将k[5]/k[1-1]就可以得到这部分总共需要处理的伸缩值了。
但是我发现这样还是有问题因为为了判断旋转这种还是会遍历一遍。那么旋转能类似前面的方式进行优化吗如果不看公式看角度的话旋转其实也是一种线性的变化无非是在前面的基础上进行加减罢了。我们可以累计这几步总共旋转了多少角度最后再统一计算。
100昏一个坐标变换居然用上前缀和我是没想到的
#include iostream
#include vector
#include cmath
using namespace std;
const int N1e5;int n,m;
//这里使用前缀和进行优化
int inst[N]{0};
double mul_k[N]{1};
double angle[N]{0};void stretch(doublex,doubley,double k)
{xk*x;yk*y;
}void rotate(doublex,doubley,double k)
{//巨大坑点计算旋转结果时要避免纵坐标受到横坐标已经计算从而变化的影响 double tempxx; xx*cos(k)-y*sin(k);ytempx*sin(k)y*cos(k);
}int main()
{cinnm; //操作和查询次数int op;double k;for(int i1;in;i){cinopk;if(op1) //在不同处理的同时需要对无关参数顺移 {mul_k[i]mul_k[i-1]*k;angle[i]angle[i-1];}else{mul_k[i]mul_k[i-1];angle[i]angle[i-1]k;}}double x,y;int l,r;while(m--){cinlrxy;stretch(x,y,mul_k[r]/mul_k[l-1]);rotate(x,y,angle[r]-angle[l-1]);printf(%.3lf %.3lf\n,x,y);} return 0;}