Untitled
unknown
plain_text
10 months ago
5.5 kB
0
Indexable
package VocabSheet; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.TreeSet; class UserSolution { int num, n, m; TreeSet<Ele>[] all; TreeSet<Node>[] allocated; TreeSet<Node>[] empty; int size; int[] max_per_section; HashMap<Integer, Node> hashMap; void display(){ int[][] arr = new int[n][m]; for(Integer key : hashMap.keySet()){ Node node = hashMap.get(key); int r = node.idx/m; int c = node.idx%m; for(int i=0;i<node.len; i++){ arr[r][c+i] = node.id; } } for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ System.out.print(arr[i][j]+" "); } System.out.println(); } System.out.println("====="); } class Ele implements Comparable<Ele>{ int id, idx, len, status; Ele(int mID, int mIdx, int mLen, int mStatus){ id = mID; idx = mIdx; len = mLen; status = mStatus; } Ele(Node mNode, int mStatus){ id = mNode.id; idx = mNode.idx; len = mNode.len; status = mStatus; } @Override public int compareTo(Ele o) { return idx - o.idx; } } class Node implements Comparable<Node>{ int id, idx, len; Node(int mID, int mIdx, int mLen){ id = mID; idx = mIdx; len = mLen; } @Override public int compareTo(Node o) { if(len == o.len){ return idx - o.idx; } return len - o.len; } } public void init(int N, int M) { // System.out.println("====="); // System.out.println(N+" "+M); size = (int) Math.sqrt(N); n = N; m = M; num = n/size; if(num*size < n) num++; hashMap = new HashMap<>(); all = new TreeSet[num]; allocated = new TreeSet[num]; empty = new TreeSet[num]; // System.out.println(n+" "+m+" "+num); for(int i=0; i<num; i++){ // System.out.println("==="); allocated[i] = new TreeSet<Node>(); empty[i] = new TreeSet<Node>(); all[i] = new TreeSet<Ele>(); for(int j=i*size; j<Math.min((i+1)*size, n); j++){ // System.out.println(j*m); empty[i].add(new Node(-1, j*m, m)); all[i].add(new Ele(-1, j*m, m, 0)); } } max_per_section = new int[num]; Arrays.fill(max_per_section, m); // display(); } public int writeWord(int mId, int mLen) { // System.out.println("write "+mId+" "+mLen); int idx = -1; for(int i=0; i<num; i++){ // System.out.println(empty[i] == null); if(max_per_section[i] < mLen) continue; // node = empty[i].ceiling(new Node(mId, -1, mLen)); // Node node = null; // int max = Integer.MAX_VALUE; // Iterator<Node> iterator = empty[i].descendingIterator(); // while (iterator.hasNext()) { // Node tmp = iterator.next(); // if(tmp.len < mLen) break; // if(tmp.idx < max){ // max = tmp.idx; // node = tmp; // } // } Node node = null, node_; int len = mLen; do{ node_ = empty[i].higher(new Node(mId, -1, len)); if(node_ == null) break; if(node == null){ node = node_; } else if(node.idx > node_.idx){ node = node_; } len = node_.len+1; }while(node_ != null); if(node != null){ // System.out.println(node.id+" "+node.idx+" "+node.len); // Node node = empty[i].ceiling(new Node(mId, -1, mLen)); idx = node.idx; hashMap.put(mId, new Node(mId, node.idx, mLen)); empty[i].remove(node); allocated[i].add(new Node(mId, node.idx, mLen)); all[i].remove(new Ele(node, 0)); all[i].add(new Ele(mId, node.idx, mLen, 1)); if(node.len > mLen){ all[i].add(new Ele(-1, node.idx+mLen, node.len-mLen, 0)); empty[i].add(new Node(-1, idx+mLen, node.len-mLen)); }else{ all[i].add(new Ele(-1, node.idx, mLen, 0)); } // System.out.println(idx/m); // display(); if(empty[i].isEmpty()) max_per_section[i] = 0; else max_per_section[i] = empty[i].last().len; return idx/m; } } // display(); return idx; } public int eraseWord(int mId) { // System.out.println("erase "+mId); Node node = hashMap.remove(mId); if(node == null){ // System.out.println(-1); // display(); return -1; } for(int i=0; i<num; i++){ if(allocated[i].contains(node)){ allocated[i].remove(node); int new_idx = node.idx; int new_len = node.len; all[i].remove(new Ele(node, 1)); Ele left = all[i].lower(new Ele(node, 0)); Ele right = all[i].higher(new Ele(node, 0)); if(left != null && left.idx/m == node.idx/m && left.status == 0){ new_idx = left.idx; new_len = left.len + new_len; all[i].remove(left); empty[i].remove(new Node(-1, left.idx, left.len)); } if(right != null && right.idx/m == node.idx/m && right.status == 0){ new_len = new_len + right.len; all[i].remove(right); empty[i].remove(new Node(-1, right.idx, right.len)); } all[i].add(new Ele(-1, new_idx, new_len, 0)); empty[i].add(new Node(-1, new_idx, new_len)); // System.out.println(node.idx/m); // display(); if(empty[i].isEmpty()) max_per_section[i] = 0; else max_per_section[i] = empty[i].last().len; return node.idx/m; } } // System.out.println(-1); // display(); return -1; } }
Editor is loading...
Leave a Comment