답안 #856021

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
856021 2023-10-02T14:36:14 Z divad Lucky Numbers (RMI19_lucky) C++14
46 / 100
200 ms 37812 KB
#include <bits/stdc++.h>
#pragma GCC optimize("fast-math")
#define EQ 0
#define LE 1
#define state(x, y) x*3+y
#define typedig(x) (x == 1 ? 0 : (x == 3 ? 1 : 2) )
using namespace std;
const int MOD = 1e9+7;
const int NMAX = 1e5+2;
const int SIGMA = 10;
const int LAT = 2*3;
int n,q,t,l,r,pos,val;
int nr_loop;
string str;

ifstream fin("test.in");
ofstream fout("test.out");

struct Mat {
    int val[LAT][LAT] = {0};
    void reset(){
        memset(val, 0, sizeof(val));
    }

    void fill_diag(){
        for(int i = 0; i < LAT; i++){
            val[i][i] = 1;
        }
    }

    Mat operator * (const Mat &aux) const {
        Mat ans;
        for(int i = 0; i < LAT; i++){
            for(int j = 0; j < LAT; j++){
                for(int k = 0; k < LAT; k++){
                    ans.val[i][j] += (val[i][k] * 1ll * aux.val[k][j])%MOD;
                    nr_loop++;
                    ans.val[i][j] %= MOD;
                }
            }
        }
        return ans;
    }

};

struct Node {
    Mat dp;
    void init(int pos){
        dp.reset();
        for(int dig = 0; dig <= 9; dig++){
            for(int lst = 0; lst <= 2; lst++){
                if(lst == 0 && dig == 3){
                    continue;
                }
                if(dig == str[pos]-'0'){
                    dp.val[state(EQ, lst)][state(EQ, typedig(dig))]++;
                }
                if(dig < str[pos]-'0'){
                    dp.val[state(EQ, lst)][state(LE, typedig(dig))]++;
                }
                dp.val[state(LE, lst)][state(LE, typedig(dig))]++;
            }
        }
    }

    int eval(){
        int ans = 0;
        for(int i = 0; i <= 2; i++){
            ans += dp.val[0][state(LE, i)] + dp.val[0][state(EQ, i)];
            ans %= MOD;
        }
        return ans;
    }

    Node operator + (const Node &aux) const {
        Node ans;
        ans.dp = dp * aux.dp;
        return ans;
    }
} aint[4*NMAX];

void build(int nod, int st, int dr){
    if(st == dr){
        aint[nod].init(st);
    }else{
        int mid = (st+dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}

Node query(int nod, int st, int dr, int l, int r){
    if(l <= st && dr <= r){
        return aint[nod];
    }else{
        int mid = (st+dr)/2;
        Node lson, rson;
        lson.dp.fill_diag();
        rson.dp.fill_diag();

        if(l <= mid){
            lson = query(2*nod, st, mid, l, r);
        }
        if(r >= mid+1){
            rson = query(2*nod+1, mid+1, dr, l, r);
        }

        return lson + rson;
    }
}

void update(int nod, int st, int dr, int pos){
    if(st == dr){
        aint[nod].init(st);
    }else{
        int mid = (st+dr)/2;
        if(pos <= mid){
            update(2*nod, st, mid, pos);
        }else{
            update(2*nod+1, mid+1, dr, pos);
        }
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

#ifdef ONPC
    #define cin fin
    #define cout fout
#endif // ONPC

    Node aux;
    aux.dp.val[0][state(EQ, typedig(0))] = 1;

    cin >> n >> q;
    cin >> str;
    str = "$"+str;
    build(1, 1, n);
    cout << (aux + aint[1]).eval() << "\n";
    while(q--){
        cin >> t;
        if(t == 1){
            cin >> l >> r;
            Node ans = query(1, 1, n, l, r);
            cout << (aux + ans).eval() << "\n";
        }else{
            cin >> pos >> val;
            str[pos] = (val+'0');
            update(1, 1, n, pos);
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 142 ms 4780 KB Output is correct
2 Correct 170 ms 6852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 142 ms 4780 KB Output is correct
2 Correct 170 ms 6852 KB Output is correct
3 Execution timed out 232 ms 37812 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 142 ms 4780 KB Output is correct
8 Correct 170 ms 6852 KB Output is correct
9 Correct 108 ms 4760 KB Output is correct
10 Correct 132 ms 6748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 142 ms 4780 KB Output is correct
8 Correct 170 ms 6852 KB Output is correct
9 Execution timed out 232 ms 37812 KB Time limit exceeded
10 Halted 0 ms 0 KB -