【Codeforces 675D】Tree Construction
阿新 • • 發佈:2019-03-21
put cep 函數 exce com 最小 buffer == static
【鏈接】 我是鏈接,點我呀:)
【題意】
依次序將數字插入到排序二叉樹當中
問你每個數字它的父親節點上的數字是啥
【題解】
按次序處理每一個數字
對於數字x
找到最小的大於x的數字所在的位置i
顯然,x要放在這個x的左子樹裏面
所以如果x的左子樹為空那麽直接放上去就好
否則,左子樹不為空的話,對於i的左兒子,從這個左兒子開始,一直往右兒子方向往下走
即未插入x之前,最大的且比i對應的數字小的數字 less
我們的x顯然是要放在less的右子樹上才行。
這個less和位置i對應的數字都能用java裏面的lower和higher函數得到
那麽根據上面的分析
如果higher對應的數字的左子樹為空,那麽x應該放在higher所在位置的左兒子上,因此答案就是higher
否則,如果higher對應的數字的左子樹不為空,那麽就應該放在less(最大的小於x的數字)的右兒子上,因此答案是less
【代碼】
import java.io.*; import java.util.*; public class Main { static InputReader in; static PrintWriter out; public static void main(String[] args) throws IOException{ //InputStream ins = new FileInputStream("E:\\rush.txt"); InputStream ins = System.in; in = new InputReader(ins); out = new PrintWriter(System.out); //code start from here new Task().solve(in, out); out.close(); } static int N = 50000; static class Task{ int n; TreeSet<Integer> dic = new TreeSet<Integer>(); HashMap<Integer,Integer> mymap[]= new HashMap[2]; public void solve(InputReader in,PrintWriter out) { for (int i = 0;i < 2;i++) mymap[i] = new HashMap<Integer,Integer>(); n = in.nextInt(); int x; x = in.nextInt(); dic.add(x); for (int i = 2;i <= n;i++) { x = in.nextInt(); Integer upper = dic.higher(x); Integer less = dic.lower(x); if (upper==null) { out.print(less+" "); mymap[1].put(less, 1); }else { if (mymap[0].containsKey(upper)) { out.print(less+" "); mymap[1].put(less, 1); }else { out.print(upper+" "); mymap[0].put(upper, 1); } } dic.add(x); } } } static class InputReader{ public BufferedReader br; public StringTokenizer tokenizer; public InputReader(InputStream ins) { br = new BufferedReader(new InputStreamReader(ins)); tokenizer = null; } public String next(){ while (tokenizer==null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(br.readLine()); }catch(IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } } }
【Codeforces 675D】Tree Construction