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 |
|
|
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 |