56952023-09-09 11:17:40TuruTamasSzivárványszámokcpp17Hibás válasz 15/4548ms4992 KiB
//
// Created by tamas on 9/8/23.
//

#include "bits/stdc++.h"
using namespace std;

string s;
long long r = 0;

struct vmi {
    bool found_max;
    int val;
    int index;
    bool thing;
    bool operator<(const vmi& a) const {
        if (found_max != a.found_max)
            return found_max < a.found_max;
        if (val != a.val)
            return val < a.val;
        if (index != a.index)
            return index < a.index;
        if (thing != a.thing)
            return thing < a.thing;
        return false;
    }
};

map<vmi, int> cache;

void f(vmi& dolog) {
    int  index = dolog.index;
    if (cache.count(dolog)) {
        r += cache[dolog];
        return;
    }
    if (index == s.size()) {
        r++;
        return;
    }
    bool found_max = dolog.found_max;
    int  val = dolog.val;
    bool thing = dolog.thing;
    int num = s[index] - '0';
    long long old_r = r;
    if (found_max) {
        int m  = thing ? val : min(num, val);
        for (int i = 0; i <= m; i++) {
            vmi v = (vmi){true, i, index + 1, (thing || (i < num))};
            f(v);
        }
    }
    else {
        int m = thing ? 9 : num;
        int l = index == 0 ? 1 : 0;
        for (int i = l; i <= m; i++) {
            vmi v = (vmi){i < val, i, index+1, (thing || (i < num))};
            f(v);
        }
    }
    if (!cache.count(dolog)) {
        cache.emplace(dolog, r - old_r);
    }
}

bool az() {
    bool f = false;
    int last = s[0] - '0';
    for (int i = 1; i < s.size(); i++) {
        int c = s[i] - '0';
        if (c - '0' < last) {
            f = true;
        }
        else if (c - '0' > last && f)
            return false;
    }
    return true;
}

long long get_val() {
    long long ret = 0;
    for (int i = 0; i < s.size()-1; i++) {
        ret += pow(10, i) * 9;
    }
    return ret+1;
}

int main() {
    cin >> s;
    bool b = az();
    bool o = false;
    while (!s.empty()) {
        vmi v = (vmi){false, 0, 0, o};
        f(v);
        o = true;
        cache.clear();
        s.pop_back();
    }
    cout << r - !b;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base15/45
1Elfogadva0/03ms1816 KiB
2Elfogadva0/03ms1944 KiB
3Hibás válasz0/026ms2072 KiB
4Elfogadva1/12ms2148 KiB
5Elfogadva1/13ms2356 KiB
6Hibás válasz0/12ms2472 KiB
7Elfogadva1/13ms2572 KiB
8Elfogadva1/13ms2780 KiB
9Elfogadva1/13ms2996 KiB
10Elfogadva1/13ms3208 KiB
11Elfogadva1/13ms3416 KiB
12Elfogadva1/13ms3632 KiB
13Elfogadva2/23ms3744 KiB
14Elfogadva2/23ms3748 KiB
15Hibás válasz0/23ms3880 KiB
16Hibás válasz0/23ms3960 KiB
17Elfogadva1/13ms3960 KiB
18Hibás válasz0/216ms3972 KiB
19Hibás válasz0/221ms4308 KiB
20Hibás válasz0/237ms4540 KiB
21Hibás válasz0/348ms4592 KiB
22Elfogadva2/24ms4488 KiB
23Hibás válasz0/24ms4720 KiB
24Hibás válasz0/24ms4804 KiB
25Hibás válasz0/237ms4864 KiB
26Hibás válasz0/241ms4912 KiB
27Hibás válasz0/246ms4896 KiB
28Hibás válasz0/248ms4896 KiB
29Hibás válasz0/248ms4992 KiB
30Hibás válasz0/248ms4872 KiB