记录编号 540712 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm.Def的命令 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 1.306 s
提交时间 2019-08-28 14:06:07 内存使用 41.13 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)

using namespace std;
const int N=4e5+7;
const double PI=acos(-1.0);

struct matrix
{
	double 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;
void build(int l,int r,int p)
{
	if (l==r) 
	{	
		lz[p].a[0][0]=0;lz[p].a[0][1]=l;
		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 query(int l,int r,int pos,int p)
{
	if (l==r) 
	{	
		printf("%.1lf %.1lf\n",lz[p].a[0][0],lz[p].a[0][1]);
		return;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if (pos<=mid) query(l,mid,pos,ls);
	else query(mid+1,r,pos,rs);
}
int main()
{
	freopen("asm_command.in","r",stdin);
	freopen("asm_command.out","w",stdout);
	scanf("%d%d",&n,&Q);
	for (int i=0;i<3;i++) I.a[i][i]=1;
	build(1,n,1);
	while (Q--)
	{
		now=I;int opt,l,r;scanf("%d%d",&opt,&l);
		double dx,dy,deg;
		if (opt==0) query(1,n,l,1);
		if (opt==1) 
		{
			scanf("%d%lf%lf",&r,&dx,&dy);
			now.a[2][0]=dx;now.a[2][1]=dy;
			update(1,n,l,r,1);
		}
		if (opt==2)
		{
			scanf("%d",&r);
			double alpha;scanf("%lf",&alpha);
			alpha=PI*alpha/180;
			double 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);
		}
	}
	return 0;
}