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