记录编号 |
540709 |
评测结果 |
AAAAAAAAAA |
题目名称 |
线性变换 |
最终得分 |
100 |
用户昵称 |
Hale |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.339 s |
提交时间 |
2019-08-28 12:17:14 |
内存使用 |
41.13 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define db double
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
const int N=4e5+7;
const db PI=acos(-1.0);
struct matrix
{
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 res;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
res.a[i][j]+=a[i][k]*x.a[k][j];
return res;
}
} lz[N],now,I;
int n,Q;
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void build(int l,int r,int p)
{
if (l==r)
{
scanf("%lf%lf",&lz[p].a[0][0],&lz[p].a[0][1]);
lz[p].a[0][2]=1;return;
}
lz[p]=I;
int mid=(l+r)>>1;
build(l,mid,ls);build(mid+1,r,rs);
}
void push_down(int p)
{
lz[ls]=lz[ls]*lz[p];
lz[rs]=lz[rs]*lz[p];
lz[p]=I;
}
void update(int l,int r,int nl,int nr,int p)
{
if (nl<=l&&r<=nr) {lz[p]=lz[p]*now;return;}
push_down(p);
int mid=(l+r)>>1;
if (nl<=mid) update(l,mid,nl,nr,ls);
if (nr>mid) update(mid+1,r,nl,nr,rs);
}
void out(int l,int r,int p)
{
if (l==r) {printf("%.2lf %.2lf\n",lz[p].a[0][0],lz[p].a[0][1]);return;}
push_down(p);
int mid=(l+r)>>1;
out(l,mid,ls);
out(mid+1,r,rs);
}
int main()
{
freopen("transformationmadrid.in","r",stdin);
freopen("transformationmadrid.out","w",stdout);
for (int i=0;i<3;i++) I.a[i][i]=1;
n=read();build(1,n,1);
Q=read();
while (Q--)
{
char s[4];scanf("%s",s);int l=read(),r=read();
now=I;
if (s[0]=='X') now.a[1][1]=-1;
if (s[0]=='Y') now.a[0][0]=-1;
if (s[0]=='O') now.a[0][0]=now.a[1][1]=0,now.a[1][0]=now.a[0][1]=1;
if (s[0]=='M') scanf("%lf%lf",&now.a[2][0],&now.a[2][1]);
if (s[0]=='R')
{
double alpha;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;
}
update(1,n,l,r,1);
}
out(1,n,1);
return 0;
}