CSES - Datatähti 2024 alku - Results
Submission details
Task:Säähavainnot
Sender:adex720
Submission time:2023-11-05 00:22:56 +0200
Language:C++ (C++17)
Status:READY
Result:0
Feedback
groupverdictscore
#10
Test results
testverdicttimescore
#10.00 s0details
#20.00 s0details
#30.00 s0details
#40.00 s0details
#50.00 s0details
#60.00 s0details
#70.00 s0details
#80.00 s0details

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:254:82: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
  254 |                     nykyinenArvo -= summatYlos[y + koko][huipunXkorjaus + x - (y + koko & 1)];
      |                                                                                ~~^~~~~~
input/code.cpp:294:82: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
  294 |                     nykyinenArvo -= summatAlas[y - koko][huipunXkorjaus + x - (y + koko & 1)];
      |                                                                                ~~^~~~~~
input/code.cpp:44:10: warning: variable 'haukia' set but not used [-Wunused-but-set-variable]
   44 |     bool haukia = false;
      |          ^~~~~~
input/code.cpp:114:9: warning: variable 'summatVaaka' set but not used [-Wunused-but-set-variable]
  114 |     int summatVaaka[n][m];
      |         ^~~~~~~~~~~

Code

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

int main()
{
    ios_base::sync_with_stdio();
    cin.tie(nullptr);

    bool debug = false;

    int n, m, k, x, y, arvo, pienempi;
    if (!debug)
    {
        cin >> n >> m >> k;
    }
    else
    {
        n = 5;
        m = 6;
        k = 13;
    }

    pienempi = min(n, m);

    if (k == 0)
    {
        cout << 0;
        return 0;
    }

    int arvot[n][m];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            arvot[i][j] = 0;
        }
    }

    int arvoYhteensa = 0;

    string kala;
    bool rapuja = false;
    bool haukia = false;
    bool onkoHauki;
    if (!debug)
    {
        for (int i = 0; i < k; i++)
        {
            cin >> y >> x;
            x--;
            y--;
            cin >> kala;
            onkoHauki = kala[0] == 'H';

            if (onkoHauki)
                haukia = true;
            else
                rapuja = true;

            arvo = onkoHauki ? 1 : -10;
            arvot[y][x] = arvo;
            arvoYhteensa += arvo;
        }
    }
    else
    {
        rapuja = true;
        haukia = true;

        arvot[0][0] = -10;
        arvot[4][0] = -10;
        arvot[1][1] = 1;
        arvot[3][1] = 1;
        arvot[4][1] = 1;
        arvot[1][5] = -10;
        arvot[2][2] = 1;
        arvot[2][3] = -10;
        arvot[2][4] = 1;
        arvot[2][5] = -10;
        arvot[3][3] = -10;
        arvot[1][4] = 1;
        arvot[4][4] = 1;
    }

    if (!rapuja)
    {
        if (k == n * m)
        {
            cout << arvoYhteensa - 1;
        }
        else
        {
            cout << arvoYhteensa;
        }
        return 0;
    }

    if (pienempi == 1)
    {
        if (n == 1 && m == 1)
        {
            cout << 0;
        }
        else
        {
            cout << arvoYhteensa + 10;
        }
        return 0;
    }

    int alas = (n - 1) / 2;
    int vinoja = m + alas;
    int summatVaaka[n][m];
    int summatAlas[n][m];
    int summatYlos[n][m];

    int summa;
    for (int y = 0; y < n; y++)
    {
        summa = 0;
        for (int x = 0; x < m; x++)
        {
            summa += arvot[y][x];
            summatVaaka[y][x] = summa;
        }
    }

    int alku = 2 * alas;
    int raja = 0;
    int uusiX;
    for (int x = 0; x < vinoja; x++) // toiseksi alimman vasemmanpuoleisinta riviä ei lasketa, kun n on parillinen
    {
        summa = 0;
        if (x >= m)
        {
            raja = 2 * (x - m) + (n & 1);
            uusiX = x - alas;
        }
        else if (x < alas)
        {
            alku = 2 * x;
            uusiX = 0;
        }
        else
        {
            alku = n - 1;
            uusiX = x - alas;
        }

        for (int y = alku; y >= raja; y--)
        {
            summa += arvot[y][uusiX];
            summatYlos[y][uusiX] = summa;
            uusiX += y & 1;
        }
    }

    raja = n;
    for (int x = 0; x < vinoja; x++)
    {
        summa = 0;
        if (x >= m)
        {
            raja = 2 * (m + alas - x);
            uusiX = x - alas;
        }
        else if (x < alas)
        {
            alku = n - 2 * x - 1;
            uusiX = 0;
        }
        else
        {
            alku = 0;
            uusiX = x - alas;
        }

        for (int y = alku; y < raja; y++)
        {
            summa += arvot[y][uusiX];
            summatAlas[y][uusiX] = summa;
            uusiX += y & 1;
        }
    }

    if (!(n & 1))
    {
        int x1 = 0;

        int x2 = 0;
        int y2 = n - 1;

        int summa1 = 0;
        int summa2 = 0;
        for (int y1 = 1; y1 < n; y1++)
        {
            summa1 += arvot[y1][x1];
            summatAlas[y1][x1] = summa1;
            summa2 += arvot[y2][x2];
            summatYlos[y2][x2] = summa2;

            y2--;
            if (y1 & 1)
            {
                x1++;
            }
            else
            {
                x2++;
            }
        }
    }

    int minimi = -10;

    int nykyinenArvo;
    int alkuarvo;

    int kokoM1;
    int huipunXkorjaus;
    for (int y = 0; y < n - 1; y++)
    {
        alkuarvo = arvot[y][0];
        kokoM1 = 0;
        for (int koko = 2; koko <= n - y && koko <= m; koko++)
        {
            kokoM1++;

            huipunXkorjaus = (koko - 1 + (y & 1)) >> 1; // optimoi

            if (y + koko < n)
            {
                int oikeaX = koko == 2 ? 0 : (koko - 2 + (y & 1)) >> 1;
                alkuarvo += summatYlos[y][kokoM1] - summatYlos[y + koko][oikeaX];
            }
            else
                alkuarvo += summatYlos[y][kokoM1];

            nykyinenArvo = alkuarvo;
            if (nykyinenArvo < minimi)
            {
                minimi = nykyinenArvo;
            }

            raja = m - koko;
            for (int x = 1; x <= raja; x++)
            {
                nykyinenArvo += summatYlos[y][kokoM1 + x] - summatAlas[y + kokoM1][huipunXkorjaus + x - 1];
                if (y > 0 && (x > 1 || (y & 1)))
                    nykyinenArvo += summatAlas[y - 1][x - 1 - ((y + 1) & 1)];

                if (y + koko < n)
                    nykyinenArvo -= summatYlos[y + koko][huipunXkorjaus + x - (y + koko & 1)];

                if (nykyinenArvo < minimi)
                {
                    minimi = nykyinenArvo;
                }
            }
        }
    }

    for (int y = n - 1; y > 0; y--)
    {
        alkuarvo = arvot[y][0];
        kokoM1 = 0;
        for (int koko = 2; y - koko >= -1 && koko <= m; koko++)
        {
            kokoM1++;

            huipunXkorjaus = (koko - 1 + (y & 1)) >> 1; // optimoi

            if (y - koko >= 0)
            {
                int oikeaX = koko == 2 ? 0 : (koko - 2 + (y & 1)) >> 1;
                alkuarvo += summatAlas[y][kokoM1] - summatAlas[y - koko][oikeaX];
            }
            else
                alkuarvo += summatAlas[y][kokoM1];

            nykyinenArvo = alkuarvo;
            if (nykyinenArvo < minimi)
            {
                minimi = nykyinenArvo;
            }

            raja = m - koko;
            for (int x = 1; x <= raja; x++)
            {
                nykyinenArvo += summatAlas[y][kokoM1 + x];
                if (y - koko > 0)
                {
                    nykyinenArvo -= summatAlas[y - koko][huipunXkorjaus + x - (y + koko & 1)];
                }

                nykyinenArvo -= summatYlos[y - kokoM1][huipunXkorjaus + x - 1];
                if (y < n - 1 && (x > 1 || (y & 1)))
                {
                    nykyinenArvo += summatYlos[y + 1][x - 1 - ((y + 1) & 1)];
                }

                if (nykyinenArvo < minimi)
                {
                    minimi = nykyinenArvo;
                }
            }
        }
    }

    cout << arvoYhteensa - minimi;
}

Test details

Test 1

Verdict:

input
1000
-0.4 -0.1 -0.2 -0.3 -0.4 -0.5 ...

correct output
0.4 0.4 0.5 0.8 0.9 1.1 1.3 1....

user output
0

Test 2

Verdict:

input
1000
2.9 2.9 2.9 2.1 2.6 2 2 2.2 2....

correct output
2.3 1.6 1.5 1.1 1 0.7 0.6 0.8 ...

user output
0

Test 3

Verdict:

input
1000
6.6 6 6.4 6 4.6 4.6 4.2 4.3 4....

correct output
10 10.9 10.3 10.1 9.1 7.3 5.7 ...

user output
0

Test 4

Verdict:

input
1000
19.4 20.2 19.1 18.9 18.3 17.3 ...

correct output
18 18.2 17 17.5 17.2 16.2 12 8...

user output
0

Test 5

Verdict:

input
1000
-5.7 -5.8 -5.8 -5.9 -7.1 -6.9 ...

correct output
-4.2 -4.1 -4 -3.8 -3.5 -3.2 -3...

user output
0

Test 6

Verdict:

input
1000
14.8 14.8 15.4 12.9 11.8 9.7 9...

correct output
11.8 11 11.6 10.8 10.4 10.4 10...

user output
0

Test 7

Verdict:

input
1000
0.7 1 2 1.4 0.6 -0.4 -0.9 -0.7...

correct output
-1.3 -0.5 -0.6 -1 -3.2 -7.2 -6...

user output
0

Test 8

Verdict:

input
1000
15.1 15.3 14.9 14.4 14.4 13.7 ...

correct output
15.6 15.9 16 15.2 14.6 14.4 13...

user output
0