56942023-09-09 11:14:35TuruTamasSzivárványszámokcpp17Hibás válasz 15/4548ms4780 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base15/45
1Elfogadva0/03ms1812 KiB
2Elfogadva0/03ms2016 KiB
3Hibás válasz0/027ms2548 KiB
4Elfogadva1/12ms2412 KiB
5Elfogadva1/13ms2600 KiB
6Hibás válasz0/13ms2820 KiB
7Elfogadva1/13ms3028 KiB
8Elfogadva1/13ms3112 KiB
9Elfogadva1/13ms3120 KiB
10Elfogadva1/13ms3244 KiB
11Elfogadva1/13ms3360 KiB
12Elfogadva1/13ms3572 KiB
13Elfogadva2/23ms3580 KiB
14Elfogadva2/23ms3576 KiB
15Hibás válasz0/23ms3700 KiB
16Hibás válasz0/23ms3776 KiB
17Elfogadva1/13ms3884 KiB
18Hibás válasz0/216ms4132 KiB
19Hibás válasz0/221ms4100 KiB
20Hibás válasz0/237ms4328 KiB
21Hibás válasz0/348ms4180 KiB
22Elfogadva2/24ms4212 KiB
23Hibás válasz0/24ms4256 KiB
24Hibás válasz0/24ms4256 KiB
25Hibás válasz0/237ms4448 KiB
26Hibás válasz0/241ms4636 KiB
27Hibás válasz0/246ms4592 KiB
28Hibás válasz0/248ms4628 KiB
29Hibás válasz0/248ms4624 KiB
30Hibás válasz0/248ms4780 KiB