Submission #1126681
Source Code Expand
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxN = (1 << 15);
void add(vector< vector<int> >& g, int s, int a, int b, int t=0, int l=0, int r=maxN){
if(b <= l || r <= a) return;
if(a <= l && r <= b){
g[2*(s+maxN-1)].push_back(2*t+1);
return;
}
add(g, s, a, b, 2*t+1, l, (l+r)/2);
add(g, s, a, b, 2*t+2, (l+r)/2, r);
}
void search(const vector< vector<int> >& g, int pos, int k, vector<int>& key, vector<int>& order, bool first){
if(key[pos] != -1) return;
key[pos] = k;
for(int i=0;i<g[pos].size();i++){
search(g, g[pos][i], k, key, order, first);
}
if(first) order.push_back(pos);
}
bool solve2sat(const vector< vector<int> >& g){
int n = g.size();
vector< vector<int> > h(n);
for(int i=0;i<g.size();++i){
for(int j=0;j<g[i].size();j++){
h[g[i][j]].push_back(i);
}
}
vector<int> key(n, -1), order;
for(int i=0;i<n;i++) search(g, i, i, key, order, true);
fill(key.begin(), key.end(), -1);
for(int i=0;i<n;i++) search(h, order[n-1-i], i, key, order, false);
for(int i=0;i<n;i+=2) if(key[i] == key[i+1]) return false;
return true;
}
bool check(const vector< pair<int,int> >& vp, const vector< vector<int> >& idx, int thr){
vector< vector<int> > g(2*(2*maxN-1));
for(int i=0;i<maxN-1;i++){
g[2*i+1].push_back(2*(2*i+1)+1);
g[2*i+1].push_back(2*(2*i+2)+1);
}
for(int i=0;i<idx.size();i++){
int a = idx[i][0]+maxN-1;
int b = idx[i][1]+maxN-1;
g[2*a+1].push_back(2*b);
g[2*b].push_back(2*a+1);
g[2*a].push_back(2*b+1);
g[2*b+1].push_back(2*a);
}
for(int i=0;i<vp.size();i++){
int l=-1, r=i;
while(r-l>1){
int m = (l+r)/2;
if(vp[i].first - vp[m].first < thr){
r = m;
} else {
l = m;
}
}
if(0 <= r && r < i) add(g, i, r, i);
l=i, r=vp.size();
while(r-l>1){
int m = (l+r)/2;
if(vp[m].first - vp[i].first < thr){
l = m;
} else {
r = m;
}
}
if(i < l) add(g, i, i+1, l+1);
}
return solve2sat(g);
}
int main(){
int N;
while(cin >> N){
vector< pair<int,int> > vp;
for(int i=0;i<2*N;i++){
int x; cin >> x;
vp.push_back(make_pair(x, i/2));
}
sort(vp.begin(), vp.end());
vector< vector<int> > idx(N);
for(int i=0;i<vp.size();i++) idx[vp[i].second].push_back(i);
int L = 0, R = 1000000007;
while(R - L > 1){
int mid = (L+R)/2;
if(check(vp, idx, mid)){
L = mid;
} else {
R = mid;
}
}
cout << L << endl;
}
}
Submission Info
Submission Time |
|
Task |
F - Flags |
User |
pes |
Language |
C++14 (GCC 5.4.1) |
Score |
1200 |
Code Size |
2504 Byte |
Status |
AC |
Exec Time |
1958 ms |
Memory |
24788 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 |
316 ms |
10992 KB |
00_example_02.txt |
AC |
339 ms |
10996 KB |
00_example_03.txt |
AC |
343 ms |
10996 KB |
01.txt |
AC |
351 ms |
11392 KB |
02.txt |
AC |
334 ms |
11184 KB |
03.txt |
AC |
333 ms |
11092 KB |
04.txt |
AC |
321 ms |
11100 KB |
05.txt |
AC |
332 ms |
11112 KB |
06.txt |
AC |
1316 ms |
21360 KB |
07.txt |
AC |
1305 ms |
21288 KB |
08.txt |
AC |
1373 ms |
21360 KB |
09.txt |
AC |
338 ms |
11376 KB |
10.txt |
AC |
338 ms |
11152 KB |
11.txt |
AC |
334 ms |
11084 KB |
12.txt |
AC |
319 ms |
11088 KB |
13.txt |
AC |
333 ms |
11092 KB |
14.txt |
AC |
1276 ms |
21232 KB |
15.txt |
AC |
1283 ms |
21212 KB |
16.txt |
AC |
1303 ms |
21232 KB |
17.txt |
AC |
349 ms |
11400 KB |
18.txt |
AC |
329 ms |
11168 KB |
19.txt |
AC |
1494 ms |
21304 KB |
20.txt |
AC |
1503 ms |
21296 KB |
21.txt |
AC |
1801 ms |
21692 KB |
22.txt |
AC |
1820 ms |
21708 KB |
23.txt |
AC |
1958 ms |
24788 KB |
24.txt |
AC |
1660 ms |
23040 KB |
25.txt |
AC |
1666 ms |
23328 KB |
26.txt |
AC |
1488 ms |
21704 KB |
27.txt |
AC |
319 ms |
10996 KB |