hqt

Untitled

hqt
Oct 10th, 2013
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.40 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStreamWriter;
  8. import java.io.PrintWriter;
  9. import java.math.BigInteger;
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.HashMap;
  13. import java.util.HashSet;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.Scanner;
  17. import java.util.Set;
  18. import java.util.StringTokenizer;
  19.  
  20. /**
  21.  * <b> Algorithm on Codeforces. Problem C div 2 </b> </br>
  22.  * @author Huynh Quang Thao
  23.  *
  24.  */
  25. public class Main {
  26.  
  27.     public static void main(String[] args) throws Exception {
  28.         Main main = new Main();
  29.         main.run();
  30.     }
  31.    
  32.     public void run() throws Exception {
  33.          Scanner sc = null;
  34.          PrintWriter pr = null;
  35.  
  36.          pr=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
  37.          sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
  38.      //   sc = new Scanner(new File("input.txt"));
  39.          
  40.          int n = sc.nextInt();
  41.          n = 2*n;
  42.          int[] arr = new int[n];
  43.          int[] first = new int[1000];
  44.          int[] second = new int[1000];
  45.          Arrays.fill(first, -1);
  46.          Arrays.fill(second, -1);
  47.          
  48.          for (int i = 0; i < n; i++) {
  49.              arr[i] = sc.nextInt();
  50.              if (first[arr[i]] == -1) first[arr[i]] = i;
  51.              else if (second[arr[i]] == -1) second[arr[i]] = i;
  52.          }
  53.          
  54.          // map contains freq of values
  55.          Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  56.          for (int i = 0; i < n; i++) {
  57.              if (!map.containsKey(arr[i])) {
  58.                  map.put(arr[i], 1);
  59.              }
  60.              else {
  61.                  map.put(arr[i], map.get(arr[i]) + 1);
  62.              }
  63.          }
  64.          
  65.          //process
  66.          int[] T = new int[n];
  67.        
  68.          // start to fill 1 or 2
  69.          int current = 0;
  70.          int heap1 = n/2, heap2 = n/2;
  71.          for (int i = 0; i < n; i++) {
  72.              int key = arr[i];
  73.              if (map.get(key) == 1) {
  74.                  if (current % 2 == 0) {
  75.                      T[i] = 1;
  76.                      heap1--;
  77.                  }
  78.                  else {
  79.                      T[i] = 2;
  80.                      heap2--;
  81.                  }
  82.                  current = (current + 1) % 2;
  83.              }
  84.              else {
  85.                  // >= 2 times appear
  86.                  int loc1 = first[key];
  87.                  int loc2 = second[key];
  88.                 // know that we have not add to heap yet
  89.                  if (T[loc1] == 0) {
  90.                      heap1--; heap2--;
  91.                      T[loc1] = 1;
  92.                      T[loc2] = 2;
  93.                  }
  94.              }
  95.          }
  96.          
  97.          // process the rest
  98.          for (int i = 0; i < n; i++) {
  99.              if (T[i] == 0 && heap1 > 0) {
  100.                  T[i] = 1;
  101.                  heap1--;
  102.              }
  103.              else if (T[i] == 0 && heap1 == 0) T[i] = 2;
  104.          }
  105.          
  106.          
  107.          // add to list
  108.          List<Integer> heap_1 = new ArrayList<Integer>();
  109.          List<Integer> heap_2 = new ArrayList<Integer>();
  110.          for (int i = 0; i < n; i++) {
  111.              if (T[i] == 1) heap_1.add(arr[i]);
  112.              else heap_2.add(arr[i]);
  113.          }
  114.          
  115.          Set<Integer> set = new HashSet<Integer>();
  116.          for (int i = 0; i < heap_1.size(); i++) {
  117.              for (int j = 0; j < heap_2.size(); j++) {
  118.                  int num = heap_1.get(i) * 100 + heap_2.get(j);
  119.                  set.add(num);
  120.              }
  121.          }
  122.          
  123.          System.out.println(set.size());
  124.          
  125.          // print
  126.          for (int i = 0; i < n; i++) {
  127.              System.out.print(T[i] + " ");
  128.          }
  129.          
  130.          pr.close();
  131.          sc.close();
  132.     }
  133.    
  134.     static class Point {
  135.         double x, y;
  136.         public Point(double x, double y) {
  137.             this.x = x;
  138.             this.y = y;
  139.         }
  140.     }
  141.  
  142.     static class InputReader {
  143.         public BufferedReader reader;
  144.  
  145.         public StringTokenizer tokenizer;
  146.  
  147.         public InputReader(InputStream stream) {
  148.             reader = new BufferedReader(new InputStreamReader(stream));
  149.             tokenizer = null;
  150.         }
  151.  
  152.         public String next() {
  153.             while (tokenizer == null || !tokenizer.hasMoreTokens()) {
  154.                 try {
  155.                     tokenizer = new StringTokenizer(reader.readLine());
  156.                 }
  157.                 catch (IOException e) {
  158.                     throw new RuntimeException(e);
  159.                 }
  160.             }
  161.             return tokenizer.nextToken();
  162.         }
  163.  
  164.         public int nextInt() {
  165.             return Integer.parseInt(next());
  166.         }
  167.  
  168.         public double nextDouble() {
  169.             return Double.parseDouble(next());
  170.         }
  171.  
  172.         public float nextFloat() {
  173.             return Float.parseFloat(next());
  174.         }
  175.  
  176.         public long nextLong() {
  177.             return Long.parseLong(next());
  178.         }
  179.  
  180.         public BigInteger nextBigInteger() {
  181.             return new BigInteger(next());
  182.         }
  183.  
  184.     }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment