Submission #4318244


Source Code Expand

import std.stdio, std.array, std.string, std.conv, std.algorithm;
import std.typecons, std.range, std.random, std.math, std.container;
import std.numeric, std.bigint, core.bitop, core.stdc.string;

int INF = 1 << 29;

void main() {
    auto N = readln.chomp.to!int;
    auto S = readln.chomp;

    int x = N;
    int y = N;

    alias RBT = RedBlackTree!(Tuple!(int, int));
    auto row = new RBT[](2*N+10);
    auto col = new RBT[](2*N+10);
    foreach (i; 0..2*N+10) row[i] = new RBT(tuple(-INF, -INF), tuple(INF, INF));
    foreach (i; 0..2*N+10) col[i] = new RBT(tuple(-INF, -INF), tuple(INF, INF));
    row[x].insert(tuple(y, y));
    col[y].insert(tuple(x, x));

    Tuple!(int, int) xrange = tuple(x, x);
    Tuple!(int, int) yrange = tuple(y, y);

    void insert(int x, int y) {
        auto ncol = tuple(x, x);
        auto nrow = tuple(y, y);

        auto left = col[y].lowerBound(tuple(x, x)).back;
        auto right = col[y].upperBound(tuple(x, x)).front;
        auto up = row[x].lowerBound(tuple(y, y)).back;
        auto down = row[x].upperBound(tuple(y, y)).front;

        if (left[1] + 1 == x) {
            col[y].removeKey(left);
            ncol[0] = left[0];
        }
        if (right[0] - 1 == x) {
            col[y].removeKey(right);
            ncol[1] = right[1];
        }
        if (up[1] + 1 == y) {
            row[x].removeKey(up);
            nrow[0] = up[0];
        }
        if (down[0] - 1 == y) {
            row[x].removeKey(down);
            nrow[1] = down[1];
        }

        col[y].insert(ncol);
        row[x].insert(nrow);

        xrange = ncol;
        yrange = nrow;
    }

    foreach (dir; S) {
        int nx = x;
        int ny = y;
        if (dir == 'R') {
            nx = col[y].upperBound(tuple(xrange[0]-1, xrange[0]-1)).front[1] + 1;
        } else if (dir == 'L') {
            nx = col[y].lowerBound(tuple(xrange[1]+1, xrange[1]+1)).back[0] - 1;
        } else if (dir == 'U') {
            ny = row[x].upperBound(tuple(yrange[0]-1, yrange[0]-1)).front[1] + 1;
        } else {
            ny = row[x].lowerBound(tuple(yrange[1]+1, yrange[1]+1)).back[0] - 1;
        }
        x = nx;
        y = ny;
        insert(x, y);
    }

    writeln(x - N, " ", y - N);
}

Submission Info

Submission Time
Task C - 幼稚園児高橋君
User nebukuro09
Language D (LDC 0.17.0)
Score 100
Code Size 2310 Byte
Status AC
Exec Time 587 ms
Memory 243964 KB

Judge Result

Set Name Sample Subtask1
Score / Max Score 0 / 0 100 / 100
Status
AC × 3
AC × 24
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt
Subtask1 subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt, subtask1_21.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 1 ms 256 KB
subtask0_sample_02.txt AC 1 ms 256 KB
subtask0_sample_03.txt AC 1 ms 256 KB
subtask1_01.txt AC 1 ms 256 KB
subtask1_02.txt AC 1 ms 380 KB
subtask1_03.txt AC 1 ms 316 KB
subtask1_04.txt AC 1 ms 256 KB
subtask1_05.txt AC 1 ms 256 KB
subtask1_06.txt AC 1 ms 380 KB
subtask1_07.txt AC 538 ms 241916 KB
subtask1_08.txt AC 539 ms 241660 KB
subtask1_09.txt AC 580 ms 239996 KB
subtask1_10.txt AC 535 ms 240892 KB
subtask1_11.txt AC 538 ms 242556 KB
subtask1_12.txt AC 582 ms 240764 KB
subtask1_13.txt AC 587 ms 243452 KB
subtask1_14.txt AC 492 ms 239996 KB
subtask1_15.txt AC 490 ms 240380 KB
subtask1_16.txt AC 496 ms 243964 KB
subtask1_17.txt AC 496 ms 242812 KB
subtask1_18.txt AC 493 ms 241660 KB
subtask1_19.txt AC 495 ms 240508 KB
subtask1_20.txt AC 497 ms 240508 KB
subtask1_21.txt AC 498 ms 241916 KB