关于这次 T1 范围
查看原帖
关于这次 T1 范围
370281
m256i楼主2023/10/21 22:35

考场成功被这题诈骗,原因是感觉不符合 S 组难度。

本来 2min 就能想出大常数线性解法的,结果一看 n≤8n \le 8?

大概代码是这样:

int a[10];
int b[650001];

struct Lock{
    int f[5];
    Lock(int x){
        f[0] = x>>16;
        f[1] = (x>>12)&0xf;
        f[2] = (x>>8)&0xf;
        f[3] = (x>>4)&0xf;
        f[4] = x&0xf;
    }
    int toInteger(){
        int s = 0;
        for (int i = 0; i < 5; ++i) s = (s<<4)|f[i];
        return s;
    }
};

// void op(Lock lk){
//     for (int i = 0; i < 5; ++i) write(lk.f[i]);
//     writeln(lk.toInteger());
// }

void transform(int x){
    Lock lk(x);
    for (int i = 0; i < 5; ++i){
        for (int j = 9; j; --j)
            lk.f[i] = (lk.f[i]+1)%10, ++b[lk.toInteger()];
        lk.f[i] = (lk.f[i]+1)%10;
    }
    for (int i = 0; i < 4; ++i){
        for (int j = 9; j; --j)
            lk.f[i] = (lk.f[i]+1)%10, lk.f[i+1] = (lk.f[i+1]+1)%10, ++b[lk.toInteger()];
        lk.f[i] = (lk.f[i]+1)%10, lk.f[i+1] = (lk.f[i+1]+1)%10;
    }
}

int main(){
    int n; read(n);
    for (int i = 1; i <= n; ++i){
        int x;
        for (int j = 5; j; --j) read(x), a[i] = (a[i]<<4)|x;
    }
    for (int i = 1; i <= n; ++i) transform(a[i]);
    int ans = 0;
    for (int i = 0; i < 650001; ++i) if (b[i] == n) ++ans;
    writeln(ans);
    return 0;
}

(不要问我为什么考场不写在线

显然复杂度是 Θ(n)\Theta(n) 的,带一个巨大常数(大概 102∼10310^2 \sim 10^3 量级),那完全可以放 10410^4 以上啊,为什么 n≤8n \le 8 /yiw

2023/10/21 22:35
加载中...