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
- hdu5493
- hdu5493 Queue
- HDU5493-Queue
- hdu5493 树状数组+二分
- HDU5493 Queue(线段树)
- hdu5493 Queue 线段树
- HDU5493 Queue【线段树】
- hdu5493 线段树
- HDU5493 Queue(线段树)
- HDU5493 Queue(线段树)
- HDU5493 Queue 线段树单点更新
- hdu5493(线段树,离线操作,点修改,区间查询)
- 深入剖析Java中的装箱和拆箱
- hdu 5491 The Next(ICPC合肥赛)
- 第一层内容:杂题
- hdu 5452 Minimum Cut(树链剖分)
- 全栈工程师需要记住的系统架构
- hdu5493
- bzoj1628: [Usaco2007 Demo]City skyline(单调队列)
- android中日期加天数的方法
- 【js】day01_JS概述_Js特点_使用JS_调试
- FIND_IN_SET如何按实际顺序输出
- 成员对象
- 导航地图3_定位
- mysql同一个表和不同表的一列复制到另一列的方法
- Unity3D中的一些Atrribute