记录编号 |
201957 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SYOI 2015] Asm.Def的命令 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
6.505 s |
提交时间 |
2015-10-31 15:56:39 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);
const int DIM=3;
class Matrix
{
public:
int n,m;//n?m?
double s[DIM][DIM];
Matrix(double s00,double s10,double s20)
{
n=3,m=1;
s[0][0]=s00;
s[1][0]=s10;
s[2][0]=s20;
}
Matrix(double x=0)//3*3,???x
{
n=m=DIM;
memset(s,0,sizeof(s));
for(int i=0;i<DIM;i++) s[i][i]=x;
}
};
Matrix operator * (const Matrix &a,const Matrix &b)
{
Matrix c;
c.n=a.n,c.m=b.m;
for(int i=0;i<c.n;i++){
for(int j=0;j<c.m;j++){
c.s[i][j]=0;
for(int k=0;k<a.m;k++){
c.s[i][j]+=(a.s[i][k]*b.s[k][j]);
}
}
}
return c;
}
Matrix get_trans(double dx,double dy)//???????
{
Matrix t(1);
t.s[0][2]=dx;
t.s[1][2]=dy;
return t;
}
Matrix get_rot(double alpha)//???????
{
alpha=alpha/180.0*pi;
Matrix t(0);
t.s[0][0]=cos(alpha),t.s[0][1]=-sin(alpha),t.s[0][2]=0;
t.s[1][0]=sin(alpha),t.s[1][1]= cos(alpha),t.s[1][2]=0;
t.s[2][0]= 0,t.s[2][1]= 0,t.s[2][2]=1;
return t;
}
#define Nil NULL
class Node
{
public:
int l,r;
Node *lc,*rc;
Matrix lazy;
Matrix pos;
void change(const Matrix &t)
{
lazy=t*lazy;
pos=t*pos;
}
void push_down(void)
{
if(lc!=Nil)
{
lc->change(lazy);
rc->change(lazy);
lazy=Matrix(1.0);
}
}
Matrix query(int a)
{
push_down();
if(l==a&&r==a) return pos;
if(a<=(l+r)/2) return lc->query(a);
else return rc->query(a);
}
void modify(int a,int b,const Matrix &t)
{
push_down();
if(a>r||b<l) return;
if(a<=l&&b>=r) change(t);
else
{
lc->modify(a,b,t);
rc->modify(a,b,t);
}
}
};
Node *build(int a,int b)
{
Node *p=new Node();
p->l=a,p->r=b;
p->lazy=Matrix(1.0);
if(a==b)
{
p->lc=p->rc=Nil;
p->pos=Matrix(0,a,1);
}
else
{
int mid=(a+b)/2;
p->lc=build(a,mid);
p->rc=build(mid+1,b);
}
return p;
}
int N,Q;
Node *root;
void work(void)
{
int cmd;
int a,b,dx,dy,deg;
for(int i=1;i<=Q;i++)
{
scanf("%d",&cmd);
if(cmd==0)
{
scanf("%d",&a);
Matrix p=root->query(a);
printf("%.1lf %.1lf\n",p.s[0][0],p.s[1][0]);
}
else if(cmd==1)
{
scanf("%d%d%d%d",&a,&b,&dx,&dy);
root->modify(a,b,get_trans(dx,dy));
}
else if(cmd==2)
{
scanf("%d%d%d",&a,&b,°);
root->modify(a,b,get_rot(deg));
}
}
}
void init(void)
{
scanf("%d%d",&N,&Q);
root=build(1,N);
}
int main()
{
freopen("asm_command.in","r",stdin);
freopen("asm_command.out","w",stdout);
init();
work();
return 0;
}