CSES - Datatähti 2018 alku - Results
Submission details
Task:Kyselyt
Sender:eliaskosunen
Submission time:2017-10-06 20:15:34 +0300
Language:C++
Status:READY
Result:37
Feedback
groupverdictscore
#1ACCEPTED12
#2ACCEPTED25
#30
Test results
testverdicttimegroup
#1ACCEPTED0.06 s1details
#2ACCEPTED0.05 s2details
#3--3details

Code

#include <algorithm>
#include <cassert>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

template <typename T>
int count_digits(T number)
{
    int digits = 0;
    while (number) {
        number /= 10;
        digits++;
    }
    return digits;
}

template <typename T>
char get_digit(T number, std::size_t digit)
{
    std::ostringstream oss;
    oss << number;
    return oss.str()[digit];
}

struct series_point {
    std::size_t member{1};
    std::size_t number{1};

    constexpr series_point() = default;

    series_point& get_point(std::size_t m)
    {
        while (true) {
            if (member >= m) {
                return *this;
            }
            member += count_digits(number++);
        }
    }

    series_point& get_prev()
    {
        member -= count_digits(--number);
        return *this;
    }

    char get_char(std::size_t m)
    {
        get_point(m);
        if (member > m) {
            get_prev();
        }
        return get_digit(number, m - member);
    }

    series_point copy() const
    {
        return *this;
    }

    friend std::ostream& operator<<(std::ostream& os, const series_point& p) {
        os << "member: " << p.member << ", number: " << p.number;
        return os;
    }
};

struct input {
    std::size_t i{0};
    std::size_t k{0};
    char result{0};

    friend std::ostream& operator<<(std::ostream& os, const input& i) {
        os << "i: " << i.i << ", k: " << i.k << ", result: " << i.result;
        return os;
    }
};

int main()
{
    /* series_point s; */
    /* assert(series_point{}.get_char(1) == '1'); */
    /* assert(series_point{}.get_char(10) == '1'); */
    /* assert(series_point{}.get_char(11) == '0'); */
    /* for (std::size_t i = 1; i <= 1000000; ++i) { */
    /*     auto a = s.get_char(i); */
    /*     auto tmp = series_point{}; */
    /*     auto b = tmp.get_char(i); */
    /*     if(a != b) { */
    /*         std::cout << " * At i = " << i << ", a != b:\n" */
    /*                   << "   a = " << a << ", b = " << b << '\n' */
    /*                   << "   State of s (a):   " << s << '\n' */
    /*                   << "   State of tmp (b): " << tmp << '\n'; */
    /*     } */
    /* } */

    series_point s;
    int q;
    std::cin >> q;

    std::vector<input> inputs(q);
    {
        std::size_t ix = 0;
        for (auto& i : inputs) {
            i.i = ix;
            std::cin >> i.k;
            ++ix;
        }
        std::sort(inputs.begin(), inputs.end(),
                  [](input a, input b) { return a.k < b.k; });
    }

    for (auto& i : inputs) {
        i.result = s.get_char(i.k);
    }

    std::sort(inputs.begin(), inputs.end(),
              [](input a, input b) { return a.i < b.i; });
    for (auto& i : inputs) {
        std::cout << i.result << '\n';
    }
}

Test details

Test 1

Group: 1

Verdict: ACCEPTED

input
1000
582
214
723
273
...

correct output
0
1
7
7
6
...

user output
0
1
7
7
6
...
Truncated

Test 2

Group: 2

Verdict: ACCEPTED

input
1000
615664
916441
627600
279508
...

correct output
1
2
3
2
2
...

user output
1
2
3
2
2
...
Truncated

Test 3

Group: 3

Verdict:

input
1000
672274832941907421
260504693279721732
646999966092970935
100853063389774434
...

correct output
7
2
2
0
9
...

user output
(empty)