最后一个点TLE,还有啥可以优化的嘛
查看原帖
最后一个点TLE,还有啥可以优化的嘛
58197
BuXiangJuanLe楼主2020/9/23 19:21

Orz

////IzayoiAster////
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define maxn 508
using namespace std;
int n, m, a[maxn][maxn], b[maxn][maxn];

inline int rd(){
    register int ret = 0, f = 1; register char ch;
    while(!isdigit(ch = getchar())) if(ch == '-') f = 0;
    ret = ch^48;
    while(isdigit(ch = getchar())) ret = (ret<<1) + (ret<<3) + (ch^48);
    return f ? ret : -ret;
}

inline void prework(){
    int cnt = 1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            a[i][j] = b[i][j] = cnt++;
    return;
}

void cp(int x, int y, int r){ //把a数组复制一下给b数组
    for(register int i=x-r; i<=x+r; i++)
        for(register int j=y-r; j<=y+r; j++)
            b[i][j] = a[i][j];
    return;
}

void rotate_l(int x, int y, int r){ //逆时针
    if(!r) return;
    for(register int i=x-r; i<=x+r; i++){
        for(register int j=y-r; j<=y+r; j++){
            int x1 = x - (y - j);
            int y1 = y - (i - x);
            a[i][j] = b[x1][y1];
        }
    }
    rotate_l(x, y, --r);
    return;
}

void rotate_r(int x, int y, int r){ //顺时针
    if(!r) return;
    for(register int i=x-r; i<=x+r; i++){
        for(register int j=y-r; j<=y+r; j++){
            int x1 = x + (y - j);
            int y1 = y + (i - x);
            a[i][j] = b[x1][y1];
        }
    }
    rotate_r(x, y, --r);
    return;
}

int main(){
    n = rd();
    m = rd();
    prework();
    while(m--){
        int x, y, r, z;
        x = rd();
        y = rd();
        r = rd();
        z = rd();
        if(z) rotate_l(x, y, r);
        else rotate_r(x, y, r);
        if(m) cp(x, y, r);
    }
    for(register int i=1; i<=n; i++){
        for(register int j=1; j<=n; j++){
            printf("%d ", a[i][j]);
        }
        putchar('\n');
    }
    return 0;
}

2020/9/23 19:21
加载中...