|
|
@@ -1,4 +1,8 @@ |
|
|
|
class Parallel extends Oblig4 { |
|
|
|
int nThreads = Math.min( |
|
|
|
Runtime.getRuntime().availableProcessors(), |
|
|
|
16); |
|
|
|
|
|
|
|
Parallel(NPunkter17 points) { |
|
|
|
super(points); |
|
|
|
name = "Parallel"; |
|
|
@@ -6,5 +10,67 @@ class Parallel extends Oblig4 { |
|
|
|
|
|
|
|
@Override |
|
|
|
void solve() { |
|
|
|
MinMaxXY minmax = findMinMax(); |
|
|
|
MAX_X = x[minmax.maxX]; |
|
|
|
MAX_Y = y[minmax.maxY]; |
|
|
|
|
|
|
|
IntList indexes = new IntList(n); |
|
|
|
for (int i = 0; i < n; ++i) |
|
|
|
indexes.add(i); |
|
|
|
} |
|
|
|
|
|
|
|
class MinMaxXY { |
|
|
|
int minX, maxX, maxY; |
|
|
|
} |
|
|
|
|
|
|
|
class FindMinMaxWorker extends Thread { |
|
|
|
int start, end; |
|
|
|
int minX, maxX, maxY; |
|
|
|
FindMinMaxWorker(int start, int end) { |
|
|
|
this.start = start; |
|
|
|
this.end = end; |
|
|
|
this.minX = start; |
|
|
|
this.maxX = start; |
|
|
|
this.maxY = start; |
|
|
|
} |
|
|
|
|
|
|
|
public void run() { |
|
|
|
for (int i = start + 1; i < end; ++i) { |
|
|
|
if (x[i] < x[minX]) |
|
|
|
minX = i; |
|
|
|
if (x[i] > x[maxX]) |
|
|
|
maxX = i; |
|
|
|
if (y[i] > y[maxY]) |
|
|
|
maxY = i; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
MinMaxXY findMinMax() { |
|
|
|
FindMinMaxWorker[] workers = new FindMinMaxWorker[nThreads]; |
|
|
|
|
|
|
|
int d = n / nThreads; |
|
|
|
for (int i = 0; i < nThreads; ++i) { |
|
|
|
workers[i] = new FindMinMaxWorker( |
|
|
|
d * i, |
|
|
|
(i == nThreads - 1 |
|
|
|
? n - 1 |
|
|
|
: d * (i + 1))); |
|
|
|
workers[i].start(); |
|
|
|
} |
|
|
|
|
|
|
|
MinMaxXY minmax = new MinMaxXY(); |
|
|
|
for (FindMinMaxWorker w: workers) { |
|
|
|
try { w.join(); } catch (InterruptedException ex) {} |
|
|
|
|
|
|
|
if (x[w.minX] < x[minmax.minX]) |
|
|
|
minmax.minX = w.minX; |
|
|
|
if (x[w.maxX] > x[minmax.maxX]) |
|
|
|
minmax.maxX = w.maxX; |
|
|
|
if (y[w.maxY] > y[minmax.maxY]) |
|
|
|
minmax.maxY = w.maxY; |
|
|
|
} |
|
|
|
|
|
|
|
return minmax; |
|
|
|
} |
|
|
|
} |