Submission #74943497


Source Code Expand

import java.util.*;
import java.io.*;

public class Main {
    static final int OFFSET = 50000;
    static final int SIZE = 100001;
    static int[] psum = new int[SIZE + 2];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int[] D = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) D[i] = Integer.parseInt(st.nextToken());

        if (M > 0) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                int x = Integer.parseInt(st.nextToken()) + OFFSET;
                if (x >= 0 && x < SIZE) psum[x + 1]++;
            }
        }
        for (int i = 0; i <= SIZE; i++) psum[i + 1] += psum[i];

        // Represent reachable as sorted list of disjoint intervals [lo, hi]
        // For each step d:
        //   canExec within interval [lo,hi]:
        //     if d>0: subinterval of p where no barr in [p, p+d]
        //             = p where nextBarrRight[p] > p+d
        //             blocked if nextBarrRight[p] <= p+d
        //             Find first barricade b >= lo: if b <= hi+d, then p in [b-d, hi] blocked
        //             Actually: split interval at each barricade within [lo, hi+d]
        //     Simpler: for interval [lo,hi], find all barricades in [lo, hi+d]
        //             Each barricade b blocks p in [b-d, b] (clipped to [lo,hi])
        //             The canExec sub-intervals are the gaps between blocked regions
        //   next intervals = original intervals (skip) union shifted canExec intervals (execute)
        //   Then merge overlapping intervals

        // Store intervals as int[2] sorted by lo
        List<int[]> intervals = new ArrayList<>();
        intervals.add(new int[]{OFFSET, OFFSET});

        // barricade sorted list
        TreeSet<Integer> barrSet = new TreeSet<>();
        for (int i = 0; i < SIZE; i++) {
            if (psum[i + 1] > psum[i]) barrSet.add(i);
        }

        for (int step = 0; step < N; step++) {
            int d = D[step];
            List<int[]> execIntervals = new ArrayList<>();

            for (int[] seg : intervals) {
                int lo = seg[0], hi = seg[1];
                // positions p in [lo,hi] that can execute d
                // d>0: need no barr in [p, p+d], p+d < SIZE
                // d<0: need no barr in [p+d, p], p+d >= 0
                int pLo = lo, pHi = hi;
                if (d > 0) pHi = Math.min(pHi, SIZE - 1 - d);
                else pLo = Math.max(pLo, -d);
                if (pLo > pHi) continue;

                // Find barricades that block some p in [pLo, pHi]
                // d>0: barr b in [pLo, pHi+d] blocks p in [b-d, b] ∩ [pLo,pHi]
                // d<0: barr b in [pLo+d, pHi] blocks p in [b, b-d] ∩ [pLo,pHi]
                int scanLo = d > 0 ? pLo : pLo + d;
                int scanHi = d > 0 ? pHi + d : pHi;
                NavigableSet<Integer> barrs = barrSet.subSet(scanLo, true, scanHi, true);

                int cur = pLo;
                for (int b : barrs) {
                    // blocked p range
                    int bpLo = d > 0 ? b - d : b;
                    int bpHi = d > 0 ? b : b - d;
                    bpLo = Math.max(bpLo, pLo);
                    bpHi = Math.min(bpHi, pHi);
                    if (cur < bpLo) {
                        execIntervals.add(new int[]{cur + d, bpLo - 1 + d});
                    }
                    cur = Math.max(cur, bpHi + 1);
                }
                if (cur <= pHi) {
                    execIntervals.add(new int[]{cur + d, pHi + d});
                }
            }

            // merge intervals ∪ execIntervals
            List<int[]> combined = new ArrayList<>(intervals);
            combined.addAll(execIntervals);
            combined.sort(Comparator.comparingInt(a -> a[0]));

            List<int[]> merged = new ArrayList<>();
            for (int[] seg : combined) {
                if (!merged.isEmpty() && seg[0] <= merged.get(merged.size()-1)[1] + 1) {
                    merged.get(merged.size()-1)[1] = Math.max(merged.get(merged.size()-1)[1], seg[1]);
                } else {
                    merged.add(new int[]{seg[0], seg[1]});
                }
            }
            intervals = merged;
        }

        int maxPos = intervals.get(intervals.size() - 1)[1];
        System.out.println(maxPos - OFFSET);
    }
}

Submission Info

Submission Time
Task E - A Walk and Barricades
User Bhuvaneshwari03
Language Java24 (OpenJDK 24.0.2)
Score 466
Code Size 4770 Byte
Status AC
Exec Time 313 ms
Memory 65900 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 466 / 466
Status
AC × 5
AC × 52
Set Name Test Cases
Sample sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt
All sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt
Case Name Status Exec Time Memory
in01.txt AC 73 ms 40300 KiB
in02.txt AC 59 ms 40592 KiB
in03.txt AC 58 ms 40676 KiB
in04.txt AC 61 ms 40604 KiB
in05.txt AC 62 ms 40712 KiB
in06.txt AC 61 ms 40460 KiB
in07.txt AC 61 ms 40432 KiB
in08.txt AC 62 ms 40592 KiB
in09.txt AC 66 ms 40688 KiB
in10.txt AC 62 ms 40324 KiB
in11.txt AC 65 ms 40596 KiB
in12.txt AC 84 ms 40928 KiB
in13.txt AC 58 ms 40720 KiB
in14.txt AC 59 ms 40668 KiB
in15.txt AC 62 ms 40384 KiB
in16.txt AC 60 ms 40560 KiB
in17.txt AC 64 ms 40380 KiB
in18.txt AC 59 ms 40500 KiB
in19.txt AC 62 ms 40552 KiB
in20.txt AC 61 ms 40408 KiB
in21.txt AC 60 ms 40624 KiB
in22.txt AC 62 ms 40172 KiB
in23.txt AC 62 ms 40704 KiB
in24.txt AC 64 ms 40768 KiB
in25.txt AC 60 ms 40424 KiB
in26.txt AC 62 ms 40376 KiB
in27.txt AC 63 ms 40388 KiB
in28.txt AC 63 ms 40628 KiB
in29.txt AC 76 ms 40688 KiB
in30.txt AC 65 ms 40972 KiB
in31.txt AC 211 ms 63456 KiB
in32.txt AC 224 ms 63252 KiB
in33.txt AC 210 ms 61476 KiB
in34.txt AC 216 ms 60392 KiB
in35.txt AC 218 ms 64172 KiB
in36.txt AC 225 ms 63300 KiB
in37.txt AC 206 ms 62788 KiB
in38.txt AC 289 ms 65464 KiB
in39.txt AC 281 ms 65100 KiB
in40.txt AC 313 ms 65900 KiB
in41.txt AC 286 ms 65636 KiB
in42.txt AC 242 ms 62748 KiB
in43.txt AC 305 ms 65844 KiB
in44.txt AC 296 ms 65000 KiB
in45.txt AC 218 ms 62252 KiB
in46.txt AC 307 ms 65276 KiB
in47.txt AC 298 ms 64484 KiB
sample01.txt AC 62 ms 40720 KiB
sample02.txt AC 62 ms 40164 KiB
sample03.txt AC 62 ms 40556 KiB
sample04.txt AC 63 ms 40844 KiB
sample05.txt AC 59 ms 40660 KiB