// UVa 10619 - Advanced Causal Measurements (ACM) #include <vector> #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; struct dot { int x, i, z; }; vector<dot> line; int n, m, x[100000], t[100000]; bool sat[100000]; bool operator <(dot a, dot b) { return a.x < b.x || (a.x == b.x && a.z < b.z); } int count(int tt) { line.clear(); for (int i = 0; i < n; i++) { int x1 = x[i] - (t[i] - tt); int x2 = x[i] + (t[i] - tt); line.push_back( { x1, i, 1 }); line.push_back( { x2, i, 2 }); } sort(line.begin(), line.end()); memset(sat, false, sizeof(sat)); int c = 0; for (int i = 0; i < line.size();) { c++; int j = i; while (i < line.size() && (line[i].z == 1 || sat[line[i].i])) i++; while (i < line.size() && line[i].x == line[i - 1].x) i++; for (; j < i; j++) sat[line[j].i] = true; while (i < line.size() && sat[line[i].i]) i++; } return c; } int main() { int cases; scanf("%d", &cases); for (int cas = 1; cas <= cases; cas++) { scanf("%d%d", &n, &m); int t1 = 0, t2 = 0, x1 = 0, x2 = 0; for (int i = 0; i < n; i++) { scanf("%d%d", &t[i], &x[i]); if (x[i] > x[x2]) x2 = i; if (x[i] < x[x1]) x1 = i; if (t[i] < t[t1]) t1 = i; if (t[i] > t[t2]) t2 = i; } int ini = t[t1] - max(x[x2] - x[x1], t[t2] - t[t1]); int fin = t[t1]; int sol = ini; while (ini <= fin) { int mid = (ini + fin) / 2; int mm = count(mid); if (mm <= m) { ini = mid + 1; sol = mid; } else fin = mid - 1; } printf("Case %d: %d\n", cas, sol); } return 0; }
Wednesday, May 13, 2015
UVa 10619 - Advanced Causal Measurements (ACM)
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment