CSES - Datatähti 2024 alku - Results
Submission details
Task:Uolevin kalansaalis
Sender:andreibe
Submission time:2023-10-30 23:28:02 +0200
Language:Java
Status:READY
Result:37
Feedback
groupverdictscore
#1ACCEPTED37
#20
Test results
testverdicttimegroup
#1ACCEPTED0.12 s1, 2details
#2ACCEPTED0.12 s1, 2details
#3ACCEPTED0.12 s1, 2details
#4ACCEPTED0.12 s1, 2details
#5ACCEPTED0.12 s1, 2details
#6ACCEPTED0.12 s1, 2details
#7ACCEPTED0.12 s1, 2details
#8ACCEPTED0.14 s1, 2details
#9ACCEPTED0.12 s1, 2details
#10ACCEPTED0.12 s1, 2details
#11ACCEPTED0.12 s1, 2details
#12ACCEPTED0.12 s1, 2details
#13ACCEPTED0.13 s1, 2details
#14ACCEPTED0.12 s1, 2details
#15ACCEPTED0.13 s1, 2details
#16--2details
#17--2details
#18--2details
#19--2details
#20--2details
#21--2details
#22--2details
#23--2details
#24--2details

Code

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Paths;
import java.util.*;

public class Datatahti {
    int[][] ar = new int[550][550];
    int[][] debugar = new int[550][550];
    int[][] rows = new int[550][550];
    int n, m, k;
    int[][] diagonals = new int[550][550];
    int[][] diagonals2 = new int[550][550];
    void printAr(int[][] ar)
    {
        int size = 4;
        for (int y = 0; y <= n + 1; y++)
        {
            if (y % 2 == 0) System.out.print("  ");
            for (int x = 0; x <= m + 1; x++)
            {
                String s =ar[y][x] + "";
                s = s + new String(new char[size - s.length()]).replace("\0", " ");

                System.out.print(s);
            }
            System.out.println();
        }
    }
    void print()
    {
        System.out.println("Array");
        printAr(ar);
        System.out.println("Diagonals");
        printAr(diagonals);
        System.out.println("Rows");
        printAr(rows);
        System.out.println("Other dianolas");
        printAr(diagonals2);
    }
    int getVal(int[][] ar, int y, int x) {
        if (y < 0 || x < 0) return 0;
        return ar[y][x];
    }
    long alasKolmio(int y, int x, int k, boolean debug)
    {
        int sumRowSmallerX = y % 2 == 1 ? x - 1 - 1 : x-1;
        int sumRowSmallerY = y - 1;
        int rowSumSmaller = getVal(rows, sumRowSmallerY, sumRowSmallerX);

        int sumRowLargerX = y % 2 == 1 ? (x-1+k-1) : (x+k-1);
        int sumRowLargerY = y-1;
        int rowSumLarger = getVal(rows, sumRowLargerY, sumRowLargerX);

        int minDiagonalX = x + k - 1 + (y % 2 == 0 ? 1 : 0);
        int minDiagonalY = y -1;
        int diagonalSmaller = diagonals2[minDiagonalY][minDiagonalX];

        int maxDiagonalX = x + (y % 2 == 1 ? (k / 2 - 1 + k % 2) : (k / 2));
        int maxDiagonalY = y +k -1;
        int diagonalLarger = diagonals2[maxDiagonalY][maxDiagonalX];

        long result = (diagonalLarger - diagonalSmaller) - (rowSumLarger - rowSumSmaller);
        if (debug) {
            debugar[sumRowSmallerY][sumRowSmallerX] = 1;
            debugar[sumRowLargerY][sumRowLargerX] = 2;
            debugar[minDiagonalY][minDiagonalX] = 3;
            debugar[maxDiagonalY][maxDiagonalX] = 4;
            debugar[y][x] = 5;

            System.out.println("DIAG X max: " + (x+maxDiagonalX));
            System.out.println("Diag X min: " + minDiagonalX);
            System.out.println( "Y: " + y + " X: " + x + " K:" + k + "=" + result);
            System.out.println(rowSumSmaller + " " + rowSumLarger + " " + diagonalSmaller + " " + diagonalLarger);
        }

        return result;
    }
    long ylosKolmio(int y, int x, int k, boolean debug)
    {
        int rowSumSmaller = rows[y][x - 1];
        int rowSumLarger = rows[y][x + k - 1];
        boolean parillinen = (y % 2 == 0);
        int minDiagonalX = x + (parillinen ?  (k / 2) : (k / 2 - 1 + k % 2));
        int diagonalSmaller = y -k - 1 < 0 ? 0 : diagonals2[y - k -1][minDiagonalX];
        int diagonalLarger = diagonals2[y - 1][x + ( parillinen ? 0 : -1)];

        long result = (rowSumLarger - rowSumSmaller) - (diagonalLarger - diagonalSmaller);
        if (debug) {
            System.out.println("Min diagonalX: " + minDiagonalX);
            System.out.println("Y: " + y + " X: " + x + " K:" + k + "=" + result);
            System.out.println( rowSumSmaller + " " + rowSumLarger + " " + diagonalSmaller + " " + diagonalLarger);
        }

        return result;
    }

    long laskeKolmionArvoAlas(int y, int x, int k)
    {
        int lengthOfRow = k;
        int total = 0;
        for (int rivi = y; rivi <= y + k - 1; rivi++)
        {
            for (int xx = x; xx < x + lengthOfRow; xx++)
            {
                total += ar[rivi][xx];
            }
            if (rivi % 2 == 0)
                x++;
            lengthOfRow--;
        }
        return total;
    }
    long laskeKolmionArvoYlos(int y, int x, int k)
    {
        int lengthOfRow = k;
        int total = 0;
        for (int rivi = y; rivi >= y - k + 1; rivi--)
        {
            for (int xx = x; xx < x + lengthOfRow; xx++)
            {
                total += ar[rivi][xx];
            }
            if (rivi % 2 == 0)
                x++;
            lengthOfRow--;
        }
        return total;
    }
    void createRandomTest(int size) throws IOException {
        System.out.println("FNDSHJFhjn");
        Random random = new Random();
        int n = Math.abs(random.nextInt()) % size + size/2;
        int m = Math.abs(random.nextInt()) % size + size / 2;
        //int k = Math.abs(random.nextInt()) % size + size / 2;
        int k = n * m;
        StringBuilder builder = new StringBuilder();
        builder.append( n + " " + m + " " + k).append("\n");
        for (int i = 0; i < k; i++)
        {
            int a = Math.abs(random.nextInt()) % (n+1) + 1;
            int b = Math.abs(random.nextInt()) % (m+1) + 1;
            char c = Math.abs(random.nextInt()) % 2 == 0 ? 'K' : 'H';
            builder.append(a +" " + b + " " + c).append("\n");
        }
        FileWriter writer = new FileWriter("input.txt");
        writer.write(builder.toString());
        writer.close();
    }
    void main() throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(Datatahti.class.getResourceAsStream("/input.txt")));
        //Scanner scanner = new Scanner(Paths.get("input.txt"));
        //createRandomTest(300);
        //System.exit(0);
        String[] line = reader.readLine().split(" ");
        n = Integer.parseInt(line[0]);
        m = Integer.parseInt(line[1]);
        k = Integer.parseInt(line[2]);
        long kokonaismaara = 0;
        for (int i = 0; i < k; i++)
        {
            int a, b;
            char c;
            line = reader.readLine().split(" ");
            a = Integer.parseInt(line[0]);
            b = Integer.parseInt(line[1]);
            c = line[2].charAt(0);

            ar[a][b] = c == 'K' ? -10 : 1;
            kokonaismaara += ar[a][b];
        }
        int L = 520;
        // down left-right
        for (int sy = 1; sy <= L; sy += 2)
        {
            int summa = 0;
            int x = 0;
            for (int y = sy; y <= L; y++)
            {
                if (y % 2 == 1)
                    x++;
                summa += ar[y][x];
                diagonals[y][x] = summa;
            }
        }
        // right left-right
        for (int sx = 1; sx <= L; sx++)
        {
            int summa = 0;
            int x = sx;
            for (int y = 1; y <= L; y++)
            {
                if (y % 2 == 1)
                    x++;
                if (y >= ar.length || x >= ar[0].length) continue;
                summa += ar[y][x];
                diagonals[y][x] = summa;
            }
        }
        // right right-left
        for (int sx = 1; sx <= L; sx++)
        {
            int x = sx;
            int summa = 0;
            for (int y = 1; y <= L; y++)
            {
                if (y % 2 == 0)
                    x--;
                if (x < 0 || y < 0)
                    continue;
                summa += diagonals[y][x];
                diagonals2[y][x] = summa;
            }
        }

        // rows
        for (int y = 0; y <= L; y++)
        {
            int summa = 0;
            for (int x = 0; x <= L; x++)
            {
                summa += diagonals[y][x];
                rows[y][x] = summa;
            }
        }
        //System.out.println("Preparing done " + n + " " + m);
        //print();
        long minSum = 999999999;
        for (int y = 1; y <= n; y++)
        {
            //System.out.println("Y" + y);
            for (int x = 1; x <= m; x++)
            {
                // down
                int maxKDown = m + 1 - x;
                maxKDown = Math.min(maxKDown, n + 1 - y);
                // up
                int maxKUp = m + 1 - x;
                maxKUp = Math.min(maxKUp, y);

                int maxK = Math.max(maxKDown, maxKUp);
                for (int k = 1; k <= maxK; k++)
                {
                    long result;
                    long oikeaArvo;

                    if (k <= maxKDown)
                    {
                        result = k == 1 ? ar[y][x] : alasKolmio(y, x, k, false);
                        /*
                        oikeaArvo = laskeKolmionArvoAlas(y, x, k);

                        if (result != oikeaArvo)
                        {
                            alasKolmio(y,x,k, true);
                            printAr(debugar);
                            System.out.println("Arvot: " + y + " " + x + " " + k);
                            System.out.println("Tulokset eivat tasmaa alas: " + result + " vs oikea: " + oikeaArvo);
                            throw new Exception("FUCK");
                        }

                         */
                        minSum = Math.min(minSum, result);
                    }
                    if (k <= maxKUp)
                    {
                        result = k == 1 ? ar[y][x] : ylosKolmio(y, x, k, false);
                        /*
                        oikeaArvo = laskeKolmionArvoYlos(y, x, k);
                        if (result != oikeaArvo)
                        {
                            ylosKolmio(y,x,k, true);
                            System.out.println("Arvot: " + y + " " + x + " " + k);
                            System.out.println( "Tulokset eivat tasmaa ylos: " + result + " vs oikea: " + oikeaArvo);
                            throw new Exception("FUCK");
                        }

                         */
                        minSum = Math.min(minSum, result);
                    }

                    // result = ylosKolmio(y,x, k);
                    // minSum = min(minSum, result);
                }
            }
        }
        System.out.println((kokonaismaara - minSum));
    }

    public static void main(String[] args) throws Exception {
        new Datatahti().main();
    }
}

Test details

Test 1

Group: 1, 2

Verdict: ACCEPTED

input
5 6 13
1 1 K
5 1 K
2 2 H
4 2 H
...

correct output
-16

user output
-16

Test 2

Group: 1, 2

Verdict: ACCEPTED

input
5 6 7
1 5 K
4 6 K
2 4 H
2 5 H
...

correct output
0

user output
0

Test 3

Group: 1, 2

Verdict: ACCEPTED

input
5 6 7
5 5 K
2 6 K
2 4 H
2 5 H
...

correct output
0

user output
0

Test 4

Group: 1, 2

Verdict: ACCEPTED

input
10 10 51
3 3 H
6 3 H
9 5 H
5 10 H
...

correct output
50

user output
50

Test 5

Group: 1, 2

Verdict: ACCEPTED

input
10 10 52
3 5 H
3 1 H
9 6 H
2 8 H
...

correct output
40

user output
40

Test 6

Group: 1, 2

Verdict: ACCEPTED

input
10 10 60
6 10 H
2 8 H
5 8 H
8 10 H
...

correct output
-15

user output
-15

Test 7

Group: 1, 2

Verdict: ACCEPTED

input
10 10 60
4 7 H
7 4 H
4 10 H
3 6 H
...

correct output
60

user output
60

Test 8

Group: 1, 2

Verdict: ACCEPTED

input
10 10 40
9 9 H
5 10 H
5 6 H
4 9 H
...

correct output
2

user output
2

Test 9

Group: 1, 2

Verdict: ACCEPTED

input
1 1 0

correct output
0

user output
0

Test 10

Group: 1, 2

Verdict: ACCEPTED

input
1 1 1
1 1 K

correct output
0

user output
0

Test 11

Group: 1, 2

Verdict: ACCEPTED

input
1 1 1
1 1 H

correct output
0

user output
0

Test 12

Group: 1, 2

Verdict: ACCEPTED

input
10 5 32
10 3 H
4 4 H
3 3 H
5 4 H
...

correct output
20

user output
20

Test 13

Group: 1, 2

Verdict: ACCEPTED

input
5 10 32
5 9 H
2 4 H
2 9 H
2 5 H
...

correct output
28

user output
28

Test 14

Group: 1, 2

Verdict: ACCEPTED

input
10 10 100
2 9 H
5 4 H
5 9 K
6 1 K
...

correct output
-439

user output
-439

Test 15

Group: 1, 2

Verdict: ACCEPTED

input
10 10 100
8 9 H
5 10 H
5 4 H
3 9 H
...

correct output
88

user output
88

Test 16

Group: 2

Verdict:

input
500 500 125000
125 261 K
84 78 K
11 200 K
481 246 K
...

correct output
-624270

user output
(empty)

Test 17

Group: 2

Verdict:

input
500 500 125100
16 61 H
37 62 H
459 125 H
318 476 H
...

correct output
124020

user output
(empty)

Test 18

Group: 2

Verdict:

input
500 500 249999
22 214 H
356 145 H
341 29 H
393 262 H
...

correct output
249999

user output
(empty)

Test 19

Group: 2

Verdict:

input
500 500 32000
30 81 H
315 34 H
78 112 H
367 166 H
...

correct output
10126

user output
(empty)

Test 20

Group: 2

Verdict:

input
500 500 126745
164 390 H
126 331 H
164 126 H
55 92 H
...

correct output
-104692

user output
(empty)

Test 21

Group: 2

Verdict:

input
500 500 71200
106 191 H
314 189 H
482 485 H
344 401 H
...

correct output
-335853

user output
(empty)

Test 22

Group: 2

Verdict:

input
500 500 67772
421 277 H
428 470 H
169 142 H
256 345 H
...

correct output
-208567

user output
(empty)

Test 23

Group: 2

Verdict:

input
500 500 27434
366 481 H
38 22 H
126 107 H
135 169 H
...

correct output
-57100

user output
(empty)

Test 24

Group: 2

Verdict:

input
500 500 93982
183 13 H
463 230 H
264 351 H
399 290 H
...

correct output
-52800

user output
(empty)