fork download
  1. import java.io.*;
  2. import coba.Queue;
  3. import coba.StdOut;
  4.  
  5. import java.lang.reflect.Array;
  6. import java.util.*;
  7.  
  8. public class TP3 {
  9. private static InputReader in;
  10. private static PrintWriter out;
  11. private static long N;
  12. private static long N1;
  13.  
  14. private static String[] kandidat;
  15. private static Object[] line;
  16.  
  17. private static BST<Long, Long> selisihTree = new BST<Long, Long>();
  18.  
  19. private static int[] persenSatu = new int[101];
  20. private static int[] persenDua = new int[101];
  21.  
  22. private static int menangSatu = 0;
  23. private static int menangDua = 0;
  24.  
  25. private static HashMap<String, Object[]> Tree = new HashMap<>();
  26.  
  27. private static ArrayList<String> provinsi = new ArrayList<>();
  28.  
  29. public static void main(String[] args) throws IOException {
  30. in = new InputReader(System.in);
  31. out = new PrintWriter(System.out);
  32.  
  33. kandidat = new String[]{in.next(), in.next()};
  34. N = in.nextInt();
  35.  
  36. for (int i = 0; i < N; i++) {
  37. if(i==0) {
  38. line = in.nextLine().split(" ");
  39. Tree.put((String) line[0], new Object[]{(long)0, (long)0, null, 0, line[0]});
  40. selisihTree.put((long)0, 1);
  41. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  42. persenDua[(int) hitungPersentase(0, 0)] += 1;
  43. for(int j = 2; j < line.length; j++) {
  44. Tree.put((String) line[j], new Object[]{(long)0, (long)0, line[0], (Integer) Tree.get(line[0])[3]+1, line[j]});
  45. provinsi.add((String) line[j]);
  46. // selisihTree.put((long)0, 1);
  47. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  48. persenDua[(int) hitungPersentase(0, 0)] += 1;
  49. }
  50. }else{
  51. line = in.nextLine().split(" ");
  52. for(int j = 2; j < line.length; j++) {
  53. Tree.put((String) line[j], new Object[]{(long)0, (long)0, line[0], (Integer) Tree.get(line[0])[3]+1, line[j]});
  54. // selisihTree.put((long)0, 1);
  55. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  56. persenDua[(int) hitungPersentase(0, 0)] += 1;
  57. }
  58. }
  59. }
  60.  
  61. N1 = in.nextInt();
  62.  
  63. for (int i = 0; i < N1; i++) {
  64. line = in.nextLine().split(" ");
  65. if(line[0].equals("TAMBAH")) {
  66. tambah((String)line[1], Long.parseLong((String)line[2]), Long.parseLong((String)line[3]));
  67. }else if(line[0].equals("ANULIR")) {
  68. anulir((String)line[1], Long.parseLong((String)line[2]), Long.parseLong((String)line[3]));
  69. }else if(line[0].equals("CEK_SUARA")) {
  70. System.out.println(Tree.get(line[1])[0] + " " + Tree.get(line[1])[1]);
  71. }else if(line[0].equals("WILAYAH_MENANG")) {
  72. if(line[1].equals(kandidat[0])) {
  73. System.out.println(menangSatu);
  74. }else{
  75. System.out.println(menangDua);
  76. }
  77. }else if(line[0].equals("CEK_SUARA_PROVINSI")) {
  78. for (String s : provinsi) {
  79. System.out.println(Tree.get(s)[4] + " " + Tree.get(s)[0] + " " + Tree.get(s)[1]);
  80. }
  81. }else if(line[0].equals("WILAYAH_MINIMAL")) {
  82. if(line[1].equals(kandidat[0])) {
  83. System.out.println(hitungMinimal(persenSatu, Integer.parseInt((String) line[2])));
  84. }else{
  85. System.out.println(hitungMinimal(persenDua, Integer.parseInt((String) line[2])));
  86. }
  87. }else if(line[0].equals("WILAYAH_SELISIH")) {
  88. if(Long.parseLong((String)line[1]) == 0){
  89. System.out.println(Tree.size());}
  90. // else {
  91. // System.out.println((selisihTree.count() - selisihTree.rank(Long.parseLong((String)line[1]))));
  92. // }
  93. }
  94. }
  95.  
  96. }
  97.  
  98. // taken from https://c...content-available-to-author-only...s.com/submissions/Petr
  99. static class InputReader {
  100. public BufferedReader reader;
  101. public StringTokenizer tokenizer;
  102.  
  103. public InputReader(InputStream stream) {
  104. reader = new BufferedReader(new InputStreamReader(stream), 32768);
  105. tokenizer = null;
  106. }
  107.  
  108. public String next() {
  109. while (tokenizer == null || !tokenizer.hasMoreTokens()) {
  110. try {
  111. tokenizer = new StringTokenizer(reader.readLine());
  112. } catch (IOException e) {
  113. throw new RuntimeException(e);
  114. }
  115. }
  116. return tokenizer.nextToken();
  117. }
  118.  
  119. public long nextInt() {
  120. return Long.parseLong(next());
  121. }
  122.  
  123. public String nextLine() throws IOException{
  124. return reader.readLine();
  125. }
  126. }
  127.  
  128. public static void tambah(String wilayah, long satu, long dua) {
  129. if((long)Tree.get(wilayah)[0] > (long)Tree.get(wilayah)[1] ) {
  130. menangSatu--;
  131. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] -= 1;
  132. persenDua[100-((int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]))] -= 1;
  133. } else if((long)Tree.get(wilayah)[0] < (long)Tree.get(wilayah)[1]) {
  134. menangDua--;
  135. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] -= 1;
  136. persenDua[100 - (int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1])] -= 1;
  137. } else {
  138. persenSatu[(int) hitungPersentase(0, 0)] -= 1;
  139. persenDua[(int) hitungPersentase(0, 0)] -= 1;
  140. }
  141.  
  142. selisihTree.delete(hitungSelisih((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]));
  143.  
  144. Tree.get(wilayah)[0] = (long) Tree.get(wilayah)[0] + satu;
  145. Tree.get(wilayah)[1] = (long) Tree.get(wilayah)[1] + dua;
  146.  
  147. selisihTree.put(hitungSelisih((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]), 1);
  148.  
  149. if((long)Tree.get(wilayah)[0] > (long)Tree.get(wilayah)[1] ) {
  150. menangSatu++;
  151. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] += 1;
  152. persenDua[100-((int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]))] += 1;
  153. } else if((long)Tree.get(wilayah)[0] < (long)Tree.get(wilayah)[1]) {
  154. menangDua++;
  155. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] += 1;
  156. persenDua[100 - (int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1])] += 1;
  157. } else {
  158. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  159. persenDua[(int) hitungPersentase(0, 0)] += 1;
  160. }
  161.  
  162. String current = (String)Tree.get(wilayah)[2];
  163. while(current != null) {
  164. if((long)Tree.get(current)[0] > (long)Tree.get(current)[1] ) {
  165. menangSatu--;
  166. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] -= 1;
  167. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] -= 1;
  168. } else if((long)Tree.get(current)[0] < (long)Tree.get(current)[1]) {
  169. menangDua--;
  170. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] -= 1;
  171. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] -= 1;
  172. } else {
  173. persenSatu[(int) hitungPersentase(0, 0)] -= 1;
  174. persenDua[(int) hitungPersentase(0, 0)] -= 1;
  175. }
  176.  
  177. selisihTree.delete(hitungSelisih((long)Tree.get(current)[0], (long)Tree.get(current)[1]));
  178.  
  179. Tree.get(current)[0] = (long) Tree.get(current)[0] + satu;
  180. Tree.get(current)[1] = (long) Tree.get(current)[1] + dua;
  181.  
  182. selisihTree.put(hitungSelisih((long)Tree.get(current)[0], (long)Tree.get(current)[1]), 1);
  183.  
  184. if((long)Tree.get(current)[0] > (long)Tree.get(current)[1] ) {
  185. menangSatu++;
  186. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] += 1;
  187. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] += 1;
  188. } else if((long)Tree.get(current)[0] < (long)Tree.get(current)[1]) {
  189. menangDua++;
  190. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] += 1;
  191. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] += 1;
  192. }else {
  193. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  194. persenDua[(int) hitungPersentase(0, 0)] += 1;
  195. }
  196.  
  197. current = (String)Tree.get(current)[2];
  198. }
  199. }
  200.  
  201. public static void anulir(String wilayah, long satu, long dua) {
  202. if((long)Tree.get(wilayah)[0] > (long)Tree.get(wilayah)[1] ) {
  203. menangSatu--;
  204. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] -= 1;
  205. persenDua[100-((int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]))] -= 1;
  206. } else if((long)Tree.get(wilayah)[0] < (long)Tree.get(wilayah)[1]) {
  207. menangDua--;
  208. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] -= 1;
  209. persenDua[100 - (int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1])] -= 1;
  210. }else {
  211. persenSatu[(int) hitungPersentase(0, 0)] -= 1;
  212. persenDua[(int) hitungPersentase(0, 0)] -= 1;
  213. }
  214.  
  215. // selisihTree.delete(hitungSelisih((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]));
  216.  
  217. Tree.get(wilayah)[0] = (long) Tree.get(wilayah)[0] - satu;
  218. Tree.get(wilayah)[1] = (long) Tree.get(wilayah)[1] - dua;
  219.  
  220. // selisihTree.put(hitungSelisih((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]), 1);
  221.  
  222. if((long)Tree.get(wilayah)[0] > (long)Tree.get(wilayah)[1] ) {
  223. menangSatu++;
  224. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] += 1;
  225. persenDua[100-((int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1]))] += 1;
  226. } else if((long)Tree.get(wilayah)[0] < (long)Tree.get(wilayah)[1]) {
  227. menangDua++;
  228. persenSatu[(int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1] )] += 1;
  229. persenDua[100 - (int) hitungPersentase((long)Tree.get(wilayah)[0], (long)Tree.get(wilayah)[1])] += 1;
  230. } else {
  231. persenSatu[(int) hitungPersentase(0, 0)] += 1;
  232. persenDua[(int) hitungPersentase(0, 0)] += 1;
  233. }
  234.  
  235. String current = (String)Tree.get(wilayah)[2];
  236. while(current != null) {
  237. if((long)Tree.get(current)[0] > (long)Tree.get(current)[1] ) {
  238. menangSatu--;
  239. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] -= 1;
  240. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] -= 1;
  241. } else if((long)Tree.get(current)[0] < (long)Tree.get(current)[1]) {
  242. menangDua--;
  243. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] -= 1;
  244. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] -= 1;
  245. } else {
  246. persenSatu[(int) hitungPersentase(0, 0)] -= 1;
  247. persenDua[(int) hitungPersentase(0, 0)] -= 1;
  248. }
  249.  
  250. // selisihTree.delete((hitungSelisih((long)Tree.get(current)[0], (long)Tree.get(current)[1])));
  251.  
  252. Tree.get(current)[0] = (long) Tree.get(current)[0] - satu;
  253. Tree.get(current)[1] = (long) Tree.get(current)[1] - dua;
  254.  
  255. // selisihTree.put((hitungSelisih((long)Tree.get(current)[0], (long)Tree.get(current)[1])), 1);
  256.  
  257. if((long)Tree.get(current)[0] > (long)Tree.get(current)[1] ) {
  258. menangSatu++;
  259. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] += 1;
  260. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] += 1;
  261. } else if((long)Tree.get(current)[0] < (long)Tree.get(current)[1]) {
  262. menangDua++;
  263. persenSatu[(int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1] )] += 1;
  264. persenDua[100-((int) hitungPersentase((long)Tree.get(current)[0], (long)Tree.get(current)[1]))] += 1;
  265. } else {
  266. persenSatu[(int) hitungPersentase(0, 0)] -= 1;
  267. persenDua[(int) hitungPersentase(0, 0)] -= 1;
  268. }
  269.  
  270. current = (String)Tree.get(current)[2];
  271. }
  272. }
  273.  
  274. public static double hitungPersentase(long satu, long dua) {
  275. if(satu == 0 && dua == 0){
  276. return 50;
  277. }
  278. else {
  279. return ((satu * 100/(satu+dua)));
  280. }
  281. }
  282.  
  283.  
  284. public static int hitungMinimal(int[] arr, int minimal) {
  285. int count = 0;
  286. for(int i=minimal; i < arr.length; i++) {
  287. count += arr[i];
  288. }
  289. return count;
  290. }
  291.  
  292. public static long hitungSelisih(long a, long b) {
  293. return Math.abs(a-b);
  294. }
  295.  
  296.  
  297. static class BST<Key extends Comparable<Key>, Value> {
  298. private Node root; // root of BST
  299.  
  300. private class Node {
  301. private Key key; // sorted by key
  302. private int val; // associated data
  303. private Node left, right; // left and right subtrees
  304. private int size; // number of nodes in subtree
  305. private int count;
  306.  
  307. public Node(Key key, int val, int size) {
  308. this.key = key;
  309. this.val = val;
  310. this.size = size;
  311. this.count = val;
  312. }
  313.  
  314. @Override
  315. public String toString() {
  316. return (String) key;
  317. }
  318. }
  319.  
  320. public BST() {
  321. }
  322.  
  323. public boolean isEmpty() {
  324. return size() == 0 && count() == 0;
  325. }
  326.  
  327. public int size() {
  328. return size(root);
  329. }
  330.  
  331. private int size(Node x) {
  332. if (x == null) return 0;
  333. else {
  334. return x.size;
  335. }
  336. }
  337.  
  338. public int count() {
  339. return count(root);
  340. }
  341.  
  342. private int count(Node x) {
  343. if (x == null) return 0;
  344. else {
  345. return x.count;
  346. }
  347. }
  348.  
  349. public void put(Key key, int val) {
  350. if (key == null) throw new IllegalArgumentException("calls put() with a null key");
  351. if (val == 0) {
  352. delete(key);
  353. return;
  354. }
  355. root = put(root, key, val);
  356. }
  357.  
  358. private Node put(Node x, Key key, int val) {
  359. if (x == null) return new Node(key, val, 1);
  360. int cmp = key.compareTo(x.key);
  361. if (cmp < 0) x.left = put(x.left, key, val);
  362. else if (cmp > 0) x.right = put(x.right, key, val);
  363. else x.val++;
  364. x.size = 1 + size(x.left) + size(x.right);
  365. x.count = x.val + count(x.left) + count(x.right);
  366. return x;
  367. }
  368.  
  369. public void deleteMin() {
  370. if (isEmpty()) throw new NoSuchElementException("Symbol table underflow");
  371. root = deleteMin(root);
  372. }
  373.  
  374. private Node deleteMin(Node x) {
  375. if (x.left == null) return x.right;
  376. x.left = deleteMin(x.left);
  377. x.size = size(x.left) + size(x.right) + 1;
  378. x.count = count(x.left) + count(x.right) + x.val;
  379. return x;
  380. }
  381.  
  382. public void delete(Key key) {
  383. if (key == null) throw new IllegalArgumentException("calls delete() with a null key");
  384. root = delete(root, key);
  385. }
  386.  
  387. private Node delete(Node x, Key key) {
  388. if (x == null) return null;
  389.  
  390. int cmp = key.compareTo(x.key);
  391. if (cmp < 0) x.left = delete(x.left, key);
  392. else if (cmp > 0) x.right = delete(x.right, key);
  393. else {
  394. if(x.val == 1) {
  395. if (x.right == null) return x.left;
  396. if (x.left == null) return x.right;
  397. Node t = x;
  398. x = min(t.right);
  399. x.right = deleteMin(t.right);
  400. x.left = t.left;
  401. }else {
  402. x.val--;
  403. }
  404. }
  405.  
  406. x.size = size(x.left) + size(x.right) + 1;
  407. x.count = count(x.left) + count(x.right) + x.val;
  408. return x;
  409. }
  410.  
  411. public Key min() {
  412. if (isEmpty()) throw new NoSuchElementException("calls min() with empty symbol table");
  413. return min(root).key;
  414. }
  415.  
  416. private Node min(Node x) {
  417. if (x.left == null) return x;
  418. else return min(x.left);
  419. }
  420.  
  421.  
  422. public int rank(Key key) {
  423. if (key == null) throw new IllegalArgumentException("argument to rank() is null");
  424. return rank(key, root);
  425. }
  426.  
  427. private int rank(Key key, Node x) {
  428. if (x == null) return 0;
  429. int cmp = key.compareTo(x.key);
  430. if (cmp < 0) return rank(key, x.left);
  431. else if (cmp > 0) return x.val + count(x.left) + rank(key, x.right);
  432. else return count(x.left);
  433. }
  434.  
  435. }}
  436.  
  437.  
  438.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:8: error: class TP3 is public, should be declared in a file named TP3.java
public class TP3 {
       ^
Main.java:2: error: package coba does not exist
import coba.Queue;
           ^
Main.java:3: error: package coba does not exist
import coba.StdOut;
           ^
3 errors
stdout
Standard output is empty