记录编号 540709 评测结果 AAAAAAAAAA
题目名称 线性变换 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 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;
}