Submission #1117752


Source Code Expand

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

/**
 * @author Pavel Mavrin
 */
public class Main {

    private int[] x;
    private int[] q;
    private Sat2 sat2;
    private int k;

    private void solve() throws IOException {
        int n = nextInt();
        int[][] points = new int[2 * n][2];
        for (int i = 0; i < n; i++) {
            points[2 * i][0] = nextInt();
            points[2 * i][1] = 2 * i;
            points[2 * i + 1][0] = nextInt();
            points[2 * i + 1][1] = 2 * i + 1;
        }
        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return Integer.compare(o1[0], o2[0]);
            }
        });
        x = new int[2 * n];
        q = new int[2 * n];
        for (int i = 0; i < 2 * n; i++) {
            x[i] = points[i][0];
            q[i] = points[i][1];
        }
        int l = 0;
        int r = 1000000001;
        sat2 = new Sat2();
        k = 1;
        while (k < 2 * n) k *= 2;
        sat2.init(k + n, 1000000);
        while (r > l + 1) {
            int m = (l + r) / 2;
            if (check(n, m)) l = m; else r = m;
        }
        out.println(l);
    }

    private boolean check(int n, int m) {
        sat2.clear();
        for (int i = 1; i < k - 1; i++) {
            int j = (i - 1) / 2;
            sat2.addEdge(2 * j, 2 * i);
        }
        for (int i = 0; i < 2 * n; i++) {
            int j = i / 2 + k / 2 - 1;
            sat2.addEdge(2 * j, (q[i] ^ 1) + 2 * k);
        }
        int l = 0;
        int r = 0;
        for (int i = 0; i < 2 * n; i++) {
            while (x[i] - x[l] >= m) l++;
            while (r < 2 * n && x[r] - x[i] < m) r++;
            ban(l, i, q[i] + 2 * k, 0, 0, k);
        }
        return sat2.solve() != null;
    }

    private void ban(int l, int r, int fr, int i, int L, int R) {
        if (L >= r || l >= R) return;
        if (L >= l && R <= r) {
            if (R == L + 1) {
                sat2.addEdge(fr, (q[L] ^ 1) + 2 * k);
            } else {
                sat2.addEdge(fr, 2 * i);
            }
            return;
        }
        int M = (L + R) / 2;
        ban(l, r, fr, 2 * i + 1, L, M);
        ban(l, r, fr, 2 * i + 2, M, R);
    }

    public class Sat2 {

        private DFS dfs1, dfs2;
        private int n;


        void clear() {
            dfs1.clear();
            dfs2.clear();
        }

        private boolean[] solve() {
            for (int i = 0; i < 2 * n; i++) {
                dfs1.dfs(i);
            }
            int[] l = new int[2 * n];
            int[] r = new int[2 * n];
            int cc = 0;
            for (int i = 2 * n - 1; i >= 0; i--) {
                int v = dfs1.p[i];
                if (!dfs2.z[v]) {
                    l[cc] = dfs2.pn;
                    dfs2.dfs(v);
                    r[cc] = dfs2.pn;
                    cc++;
                }
            }
            int[] c = new int[2 * n];
            for (int i = 0; i < cc; i++) {
                for (int j = l[i]; j < r[i]; j++) {
                    c[dfs2.p[j]] = i;
                }
            }
            for (int i = 0; i < n; i++) {
                if (c[2 * i] == c[2 * i + 1]) {
                    return null;
                }
            }
//            boolean[] set = new boolean[cc];
//            boolean[] res = new boolean[n];
//            for (int i = 0; i < 2 * n; i++) {
//                int v = c[dfs2.p[i]];
//                if (!set[v]) {
//                    set[v] = true;
//                    set[c[dfs2.p[l[v]] ^ 1]] = true;
//                    for (int j = l[v]; j < r[v]; j++) {
//                        int x = dfs2.p[j];
//                        if (x < 2 * n) {
//                            res[x / 2] = x % 2 == 0;
//                        }
//                    }
//                }
//            }
            return new boolean[0];
        }

        private void init(int n, int m) {
            this.n = n;
            dfs1 = new DFS();
            dfs1.init(2 * n, 2 * m);
            dfs2 = new DFS();
            dfs2.init(2 * n, 2 * m);
        }

        private void addEdge(int v, int u) {
            dfs1.addEdge(v, u);
            dfs1.addEdge(u ^ 1, v ^ 1);
            dfs2.addEdge(u, v);
            dfs2.addEdge(v ^ 1, u ^ 1);
        }

        public class DFS {

            int[] p;
            int pn;

            void init(int n, int m) {
                this.n = n;
                this.m = m;
                last = 0;
                head = new int[n];
                nx = new int[m];
                dst = new int[m];
                Arrays.fill(head, -1);
                z = new boolean[n];
                p = new int[n];
            }

            public void clear() {
                Arrays.fill(head, -1);
                Arrays.fill(z, false);
                last = 0;
                pn = 0;
            }

            void addEdge(int x, int y) {
                if (last == dst.length) {
                    int newSize = dst.length * 3 / 2 + 1;
                    int[] newDst = new int[newSize];
                    System.arraycopy(dst, 0, newDst, 0, dst.length);
                    dst = newDst;
                    int[] newNx = new int[newSize];
                    System.arraycopy(nx, 0, newNx, 0, nx.length);
                    nx = newNx;
                }
                nx[last] = head[x];
                dst[last] = y;
                head[x] = last;
                last++;
            }

            private void dfs(int x) {
                if (z[x]) return;
                z[x] = true;
                int j = head[x];
                while (j >= 0) {
                    int y = dst[j];
                    dfs(y);
                    j = nx[j];
                }
                p[pn++] = x;
            }

            int n, m;
            int[] head;
            int[] nx;
            int[] dst;
            boolean[] z;
            int last;

        }
    }

    // ------------------

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    PrintWriter out = new PrintWriter(System.out);

    String next() throws IOException {
        while (st == null || !st.hasMoreTokens()) {
            st = new StringTokenizer(br.readLine());
        }
        return st.nextToken();
    }

    int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public static void main(String[] args) throws IOException {
        new Main().run();
    }

    private void run() throws IOException {
        solve();
        out.close();
    }

}

Submission Info

Submission Time
Task F - Flags
User pashka
Language Java8 (OpenJDK 1.8.0)
Score 1200
Code Size 7084 Byte
Status AC
Exec Time 1079 ms
Memory 94752 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1200 / 1200
Status
AC × 3
AC × 30
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt, 00_example_03.txt
All 00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 82 ms 49876 KB
00_example_02.txt AC 90 ms 51668 KB
00_example_03.txt AC 96 ms 53076 KB
01.txt AC 147 ms 53732 KB
02.txt AC 123 ms 56544 KB
03.txt AC 104 ms 51540 KB
04.txt AC 105 ms 53460 KB
05.txt AC 95 ms 54868 KB
06.txt AC 697 ms 87040 KB
07.txt AC 687 ms 90412 KB
08.txt AC 756 ms 89056 KB
09.txt AC 152 ms 52824 KB
10.txt AC 110 ms 54868 KB
11.txt AC 93 ms 52308 KB
12.txt AC 93 ms 51540 KB
13.txt AC 104 ms 54612 KB
14.txt AC 847 ms 90852 KB
15.txt AC 663 ms 88728 KB
16.txt AC 946 ms 91756 KB
17.txt AC 147 ms 57360 KB
18.txt AC 124 ms 56656 KB
19.txt AC 755 ms 94428 KB
20.txt AC 717 ms 87116 KB
21.txt AC 760 ms 87320 KB
22.txt AC 976 ms 91336 KB
23.txt AC 912 ms 86700 KB
24.txt AC 793 ms 87884 KB
25.txt AC 1079 ms 94752 KB
26.txt AC 783 ms 86344 KB
27.txt AC 79 ms 52180 KB