记录编号 |
445006 |
评测结果 |
AAAAAAAAAA |
题目名称 |
线性变换 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.926 s |
提交时间 |
2017-09-04 20:44:55 |
内存使用 |
27.78 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef double db;
const db pi=acos(-1.0);
struct matrix{//保存:[横坐标,纵坐标,1]
db a[3][3];
matrix(){
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
a[i][j]=0;
}
matrix operator * (const matrix &x)const{
matrix ans;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
ans.a[i][j]+=a[i][k]*x.a[k][j];
return ans;
}
}tag[N],now,I;
int n,m;
#define lc x<<1
#define rc x<<1|1
void build(int x,int l,int r){
if (l==r){
scanf("%lf%lf",&tag[x].a[0][0],&tag[x].a[0][1]);
tag[x].a[0][2]=1;
return;
}
tag[x]=I;
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void pushdown(int x){
tag[lc]=tag[lc]*tag[x];
tag[rc]=tag[rc]*tag[x];
tag[x]=I;
}
void modify(int x,int l,int r,int L,int R){
if (l>=L&&r<=R) return void(tag[x]=tag[x]*now);
pushdown(x);
int mid=(l+r)>>1;
if (L<=mid) modify(lc,l,mid,L,R);
if (R>mid) modify(rc,mid+1,r,L,R);
}
void print(int x,int l,int r){
if (l==r) return (void)printf("%.2lf %.2lf\n",tag[x].a[0][0],tag[x].a[0][1]);
pushdown(x);
int mid=(l+r)>>1;
print(lc,l,mid);
print(rc,mid+1,r);
}
int main()
{
freopen("transformationmadrid.in","r",stdin);
freopen("transformationmadrid.out","w",stdout);
for (int i=0;i<3;i++) I.a[i][i]=1;
scanf("%d",&n);
build(1,1,n);
//print(1,1,n);puts("");
scanf("%d",&m);
char str[10]="";
for (int i=1;i<=m;i++){
int l,r;db alpha;
scanf("%s%d%d",str,&l,&r);
now=I;
if (str[0]=='X') now.a[1][1]=-1;
if (str[0]=='Y') now.a[0][0]=-1;
if (str[0]=='O') now.a[0][0]=now.a[1][1]=0,now.a[0][1]=now.a[1][0]=1;
if (str[0]=='M') scanf("%lf%lf",&now.a[2][0],&now.a[2][1]);
if (str[0]=='R'){
scanf("%lf",&alpha);
alpha=pi*alpha/180;
db x=cos(alpha),y=sin(alpha);
now.a[0][0]=x;now.a[1][0]=-y;
now.a[0][1]=y;now.a[1][1]=x;
}
modify(1,1,n,l,r);
//print(1,1,n);puts("");
}
print(1,1,n);
return 0;
}