记录编号 |
540712 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SYOI 2015] Asm.Def的命令 |
最终得分 |
100 |
用户昵称 |
Hale |
是否通过 |
通过 |
代码语言 |
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;
}