记录编号 445006 评测结果 AAAAAAAAAA
题目名称 线性变换 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.926 s
提交时间 2017-09-04 20:44:55 内存使用 27.78 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef double db;
const db pi=acos(-1.0);
struct matrix{//保存:[横坐标,纵坐标,1]
    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 ans;
        for (int i=0;i<3;i++)
        for (int j=0;j<3;j++)
        for (int k=0;k<3;k++)
            ans.a[i][j]+=a[i][k]*x.a[k][j];
        return ans;
    }
}tag[N],now,I;
int n,m;
#define lc x<<1
#define rc x<<1|1
void build(int x,int l,int r){
    if (l==r){
        scanf("%lf%lf",&tag[x].a[0][0],&tag[x].a[0][1]);
        tag[x].a[0][2]=1;
        return;
    }
    tag[x]=I;
    int mid=(l+r)>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
}
void pushdown(int x){
    tag[lc]=tag[lc]*tag[x];
    tag[rc]=tag[rc]*tag[x];
    tag[x]=I;
}
void modify(int x,int l,int r,int L,int R){
    if (l>=L&&r<=R) return void(tag[x]=tag[x]*now);
    pushdown(x);
    int mid=(l+r)>>1;
    if (L<=mid) modify(lc,l,mid,L,R);
    if (R>mid) modify(rc,mid+1,r,L,R);
}
void print(int x,int l,int r){
    if (l==r) return (void)printf("%.2lf %.2lf\n",tag[x].a[0][0],tag[x].a[0][1]);
    pushdown(x);
    int mid=(l+r)>>1;
    print(lc,l,mid);
    print(rc,mid+1,r);
}
int main()
{
    freopen("transformationmadrid.in","r",stdin);
    freopen("transformationmadrid.out","w",stdout);
    for (int i=0;i<3;i++) I.a[i][i]=1;
    scanf("%d",&n);
    build(1,1,n);
    //print(1,1,n);puts("");
    scanf("%d",&m);
    char str[10]="";
    for (int i=1;i<=m;i++){
        int l,r;db alpha;
        scanf("%s%d%d",str,&l,&r);
        now=I;
        if (str[0]=='X') now.a[1][1]=-1;
        if (str[0]=='Y') now.a[0][0]=-1;
        if (str[0]=='O') now.a[0][0]=now.a[1][1]=0,now.a[0][1]=now.a[1][0]=1;
        if (str[0]=='M') scanf("%lf%lf",&now.a[2][0],&now.a[2][1]);
        if (str[0]=='R'){
            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;
        }
        modify(1,1,n,l,r);
        //print(1,1,n);puts("");
    }
    print(1,1,n);
    return 0;
}