CSES - Datatähti 2022 alku - Results
Submission details
Task:Spiraali (Spiral)
Sender:Bliz
Submission time:2021-10-05 20:36:39
Language:C++11
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#10.01 s1details
#20.01 s2details
#30.01 s3details

Code

#include <iostream>
#include <cmath>

using namespace std;

struct Point
{
    int x, y;
};

void get_input(Point points[], int t)
{
    int x, y;
    for (int i = 0; i < t; i++)
    {
        cin >> y >> x;
        points[i] = Point{x, y};
    }
}

long long segment(int l, int c, int x, int y)
{
    return l * l + (c * (l + 1) - 1) + x + y;
}

long long get_result(int n, Point point)
{
    int m = (n >> 1); // n / 2
    int x = point.x, y = point.y;

    int l;       // Kerroksen sisäpuolelle jäävän palikan halkaisija
    long long r; // vastaus = n^2 - r;
                 // r on ruudun numero, jos spiraali alkaisi keskeltä 0:lla.
    if (y <= m)
    {
        if (x <= m)
        {
            if (x > y)
            {
                l = 2 * (m - y);
                r = segment(l, 0, x, -y);
            }
            else
            {
                l = 2 * (m - x);
                r = segment(l, 4, -y, x);
            }
        }
        else
        {
            if (n - x >= y)
            {
                l = 2 * (m - y);
                r = segment(l, 0, x, -y);
            }
            else
            {
                l = 2 * (x - m - 1);
                r = segment(l, 2, y, -x);
            }
        }
    }
    else
    {
        if (x > m)
        {
            if (x < y)
            {
                l = 2 * (y - m - 1);
                r = segment(l, 2, -x, y);
            }
            else
            {
                l = 2 * (x - m - 1);
                r = segment(l, 2, y, -x);
            }
        }
        else
        {
            if (x > n - y)
            {
                l = 2 * (y - m - 1);
                r = segment(l, 2, -x, y);
            }
            else
            {
                l = 2 * (m - x);
                r = segment(l, 4, -y, x);
            }
        }
    }
    return n * n - r;
}

void get_results(long long results[], int n, Point points[], int t)
{
    for (int i = 0; i < t; i++)
        results[i] = get_result(n, points[i]);
}

void print_results(long long results[], int t)
{
    for (int i = 0; i < t; i++)
        cout << results[i] << "\n";
    cout << "Done\n";
}

int main()
{
    int n, t;
    cin >> n >> t;
    Point points[t];
    get_input(points, t);
    long long results[t];
    get_results(results, n, points, t);
    print_results(results, t);
}

Test details

Test 1

Group: 1

Verdict:

input
10 100
1 1
1 2
1 3
1 4
...

correct output
1
36
35
34
33
...

user output
1
36
35
34
33
...

Test 2

Group: 2

Verdict:

input
1000 1000
371 263
915 322
946 880
53 738
...

correct output
773533
312166
206053
200080
593922
...

user output
773533
312166
206053
200080
593922
...

Test 3

Group: 3

Verdict:

input
1000000000 1000
177757853 827347032
409613589 419171337
739269360 256524697
328695530 896842209
...

correct output
571375684522141210
967321186816598569
762879105851175000
370065046779516790
936897883750373771
...

user output
-2596477414
-1947622871
-3240906664
152360822
-2956879477
...