CSES - Datatähti 2022 alku - Results
Submission details
Task:Spiraali
Sender:Bliz
Submission time:2021-10-05 21:22:47 +0300
Language:C++11
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED15
#2ACCEPTED20
#3ACCEPTED65
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1details
#2ACCEPTED0.01 s2details
#3ACCEPTED0.01 s3details

Code

#include <iostream>
#include <cmath>

using namespace std;

struct Point
{
    long long x, y;
};

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

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

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

    long long 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, 0u, x, -y);
            }
            else
            {
                l = 2 * (m - x);
                r = segment(l, 4u, -y, x);
            }
        }
        else
        {
            if (n - x >= y)
            {
                l = 2 * (m - y);
                r = segment(l, 0u, x, -y);
            }
            else
            {
                l = 2 * (x - m - 1);
                r = segment(l, 2u, y, -x);
            }
        }
    }
    else
    {
        if (x > m)
        {
            if (x < y)
            {
                l = 2 * (y - m - 1);
                r = segment(l, 2u, -x, y);
            }
            else
            {
                l = 2 * (x - m - 1);
                r = segment(l, 2u, y, -x);
            }
        }
        else
        {
            if (x > n - y)
            {
                l = 2 * (y - m - 1);
                r = segment(l, 2u, -x, y);
            }
            else
            {
                l = 2 * (m - x);
                r = segment(l, 4u, -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";
}

int main()
{
    int n;
    int 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: ACCEPTED

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: ACCEPTED

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: ACCEPTED

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

correct output
571375684522141210
967321186816598569
762879105851175000
370065046779516790
936897883750373771
...

user output
571375684522141210
967321186816598569
762879105851175000
370065046779516790
936897883750373771
...