hdu5493

来源:互联网 发布:网络传输速率的单位 编辑:程序博客网 时间:2024/06/05 00:42

有n个人,每个人的身高和左边或右边比自己高的人的个数num[i],输出符合给出的条件且字典序最小的从左到右队列里每个人的身高。
先按身高从小到大排个序,考虑第i个人前面留的位置肯定是num[i]或n-i-num[i]中的较小值,这样才能让字典序最小,一旦有n - i - num[i]的值小于0说明无解。

import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.StreamTokenizer;import java.math.BigInteger;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.NavigableSet;import java.util.PriorityQueue;import java.util.Queue;import java.util.Scanner;import java.util.Set;import java.util.SortedSet;import java.util.Stack;import java.util.StringTokenizer;import java.util.TreeSet;public class Main {    public static void main(String[] args) throws IOException{           StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in));            InputReader in = new InputReader(System.in)  ;           PrintWriter out = new PrintWriter(System.out) ;             int t = in.nextInt() ;           for(int cas = 1 ; cas <= t ; cas++){                 out.print("Case #" + cas + ":") ;                 new Task().solve(in, out) ;           }           out.flush() ;    }}class  Task{       static  int  N = 100008 ;       static  int[] sum = new int[N<<2] ;       static  int[] ans = new int[N] ;       void  make(int l , int r , int root){             sum[root] = r - l + 1 ;             if(l == r) return ;             int m = (l + r) >> 1 ;             make(l, m, root<<1) ;             make(m+1 , r, root<<1|1) ;       }       void  update(int k , int h , int l , int r , int root){             sum[root]-- ;             if(l == r){                    ans[l] = h ;                    return ;             }             int m = (l + r) >> 1 ;             if(sum[root<<1] > k) update(k, h, l, m, root<<1) ;             else update(k-sum[root<<1] , h, m+1, r, root<<1|1) ;       }       static  class  Person implements Comparable<Person>{               int   high ;               int   num  ;               public int compareTo(Person o) {                       return Integer.compare(high, o.high)   ;               }                public Person(int _high , int _num){                       this.high = _high ;                        this.num = _num ;                }       }       static  Person[] p  = new Person[N] ;       void   solve(InputReader in , PrintWriter out){              int n = in.nextInt()  ;              for(int i = 1 ; i <= n ; i++)  p[i] = new Person(in.nextInt(), in.nextInt()) ;              Arrays.sort(p , 1 , 1+n) ;              make(1, n, 1);              boolean  impossible = false  ;              for(int i = 1 ; i <= n ; i++){                    if(impossible) continue ;                    int k = Math.min(p[i].num , n-i-p[i].num) ;                    if(k < 0){                           impossible =  true ;                           break ;                    }                    update(k, p[i].high, 1, n, 1) ;              }              if(impossible) out.println(" impossible");              else{                    for(int i = 1 ; i <= n ; i++) out.print(" " + ans[i]) ;                    out.println() ;              }       }} class   InputReader{        public BufferedReader  reader;        public StringTokenizer  tokenizer;        public InputReader(InputStream stream){               reader = new BufferedReader(new InputStreamReader(stream), 32768) ;               tokenizer = null ;        }        public String next(){               while(tokenizer == null || ! tokenizer.hasMoreTokens()){                        try{                            tokenizer = new StringTokenizer(reader.readLine());                        }catch (IOException e) {                             throw new RuntimeException(e);                        }               }               return tokenizer.nextToken();          }        public int  nextInt(){                    return Integer.parseInt(next());        }        public long nextLong(){                    return Long.parseLong(next());        }        public double nextDouble(){                    return  Double.parseDouble(next());        }}
0 0
原创粉丝点击