Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map.Entry;
- import java.util.Random;
- public class Main {
- static int myId = -1;
- static void err(String s) {
- System.err.println("thread " + myId + ": " + s);
- }
- public static void main(String[] args) {
- // long START = System.currentTimeMillis();
- myId = message.MyNodeId();
- int nodes = message.NumberOfNodes();
- int n = (int) winning_move.GetNumPlayers();
- int len = 1 + (n - 1) / nodes;
- int left = Math.min(n, len * myId);
- int right = Math.min(n, len * (myId + 1));
- final int MOD = 100003;
- Random rnd = new Random(123);
- int[] id = new int[MOD];
- for (int i = 0; i < MOD; i++) {
- id[i] = rnd.nextInt(nodes);
- }
- int sz = right - left;
- long[] h = new long[sz];
- for (int i = 0; i < sz; i++) {
- h[i] = winning_move.GetSubmission(i + left);
- }
- HashMap<Long, Integer> cnt = new HashMap<>();
- for (long v : h) {
- Integer count = cnt.get(v);
- if (count == null) {
- count = 0;
- }
- cnt.put(v, count + 1);
- }
- ArrayList<Value> all = new ArrayList<>();
- for (Entry<Long, Integer> entry : cnt.entrySet()) {
- all.add(new Value(entry.getKey(), entry.getValue(), id[(int)(entry.getKey() % MOD)]));
- }
- Collections.sort(all);
- int it = 0;
- for (int i = 0; i < nodes; i++) {
- ArrayList<Value> now = new ArrayList<>();
- while (it < all.size() && all.get(it).sendTo == i) {
- now.add(all.get(it));
- it++;
- }
- message.PutInt(i, now.size());
- for (int j = 0; j < now.size(); j++) {
- message.PutLL(i, now.get(j).value);
- message.PutInt(i, now.get(j).cnt);
- }
- message.Send(i);
- }
- cnt = new HashMap<>();
- for (int i = 0; i < nodes; i++) {
- message.Receive(i);
- int s = message.GetInt(i);
- for (int j = 0; j < s; j++) {
- long value = message.GetLL(i);
- int cntValue = message.GetInt(i);
- Integer count = cnt.get(value);
- if (count == null) {
- count = 0;
- }
- cnt.put(value, count + cntValue);
- }
- }
- Long best = Long.MAX_VALUE;
- for (Entry<Long, Integer> entry : cnt.entrySet()) {
- if (entry.getKey() < best && entry.getValue() == 1) {
- best = entry.getKey();
- }
- }
- message.PutLL(0, best);
- message.Send(0);
- if (myId == 0) {
- for (int i = 0; i < nodes; i++) {
- message.Receive(i);
- best = Math.min(best, message.GetLL(i));
- }
- System.out.println(best == Long.MAX_VALUE ? 0 : best);
- }
- }
- static class Value implements Comparable<Value> {
- long value;
- int cnt;
- int sendTo;
- public Value(long value, int cnt, int sendTo) {
- super();
- this.value = value;
- this.cnt = cnt;
- this.sendTo = sendTo;
- }
- @Override
- public int compareTo(Value arg0) {
- return Integer.compare(sendTo, arg0.sendTo);
- }
- }
- }
Add Comment
Please, Sign In to add comment