Advertisement
Betlista

TRAINING problem CodeChef

Apr 30th, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.63 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.LinkedList;
  6. import java.util.NavigableMap;
  7. import java.util.PriorityQueue;
  8. import java.util.TreeMap;
  9.  
  10. class SelectionForTrainingCamps {
  11.  
  12.     public static void main( final String[] args ) throws Exception {
  13.         final BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
  14.         final int T = toi( br.readLine() );
  15.         for ( int ii = 0; ii < T; ii++ ) {
  16.             final int N = toi( br.readLine() );
  17.             final int[] w = new int[ N ];
  18.             final int[] h = new int[ N ];
  19.             for ( int i = 0; i < h.length; i++ ) {
  20.                 final int[] t = toi( br.readLine().split( " " ) );
  21.                 w[i] = t[0];
  22.                 h[i] = t[1];
  23.             }
  24.             System.out.println( solve( N, w, h ) );
  25.         }
  26.     }
  27.  
  28.     public static String solve( final int n, final int[] w, final int[] h ) {
  29.         // initialization
  30.         final TreeMap<Integer, PriorityQueue<Kid>> ws = new TreeMap<Integer, PriorityQueue<Kid>>(); // tree sorted by weight
  31.         final Kid[] kids = new Kid[ n ];
  32.         for ( int i = 0; i < w.length; i++ ) {
  33.             kids[i] = new Kid( w[i], h[i] );
  34.             PriorityQueue<Kid> pq = ws.get( w[i] );
  35.             if ( pq == null ) pq = new PriorityQueue<Kid>( 128, Collections.reverseOrder() );
  36.             pq.add( kids[i] );
  37.             ws.put( w[i], pq );
  38.         }
  39.         Arrays.sort( kids ); // order by height, decreasing
  40.  
  41.         final StringBuilder buff = new StringBuilder();
  42.         int teams = 0;
  43.         for ( int i = 0; i < kids.length; i++ ) { // iterate kids by decreasing height O(N)
  44.             if ( kids[i].inTeam ) continue;
  45.             ++teams;
  46.             // manage team captain = the kid first in team
  47.             kids[i].inTeam = true;
  48.             {
  49.                 final PriorityQueue<Kid> pq = ws.get( kids[i].w );
  50.                 pq.poll();
  51.                 if ( pq.isEmpty() ) {
  52.                     ws.remove( kids[i].w );
  53.                 }
  54.             }
  55.             int cnt = 1; // captain
  56.             // get all kids with greater weight - O(log(N))
  57.             final NavigableMap<Integer, PriorityQueue<Kid>> gw = ws.tailMap( kids[i].w, false );
  58.             final LinkedList<Integer> toRemove = new LinkedList<Integer>();
  59.             for ( final int weight : gw.keySet() ) { // this loop runs max O(N) times together
  60.                 final PriorityQueue<Kid> pq = gw.get( weight );
  61.                 final Kid kid = pq.poll();
  62.                 if ( pq.isEmpty() ) toRemove.add( weight );
  63.                 kid.inTeam = true;
  64.                 ++cnt;
  65.             }
  66.             for ( final int key : toRemove ) {
  67.                 ws.remove( key );
  68.             }
  69.             buff.append( ' ' ).append( cnt );
  70.         }
  71.         buff.replace( 0, 1, teams + "\n" );
  72.         return buff.toString();
  73.     }
  74.  
  75.     static class Kid implements Comparable<Kid> {
  76.         int w;
  77.         int h;
  78.         boolean inTeam = false;
  79.  
  80.         public Kid(final int w, final int h) {
  81.             this.w = w;
  82.             this.h = h;
  83.         }
  84.  
  85.         @Override
  86.         public int compareTo( final Kid k ) {
  87.             return -Integer.valueOf( this.h ).compareTo( k.h );
  88.         }
  89.     }
  90.  
  91.     public static int[] toi( final String... sa ) {
  92.         final int[] res = new int[ sa.length ];
  93.         for ( int i = 0; i < res.length; i++ )
  94.             res[i] = Integer.parseInt( sa[i] );
  95.         return res;
  96.     }
  97.  
  98.     public static int toi( final String s ) {
  99.         return Integer.parseInt( s );
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement