蓝桥杯晚会节目单线段树

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int m = scan.nextInt();
		int[] input = new int[n+1];
		for(int i = 1;i<=n;i++) {
			input[i] = scan.nextInt();
		}
		scan.close();
		Segment segment = new Segment(n,input);
		int start = 1;
		int end = n-m+1;
		for(int i = 1;i<=m;i++) {
			int t = 0;
			t = segment.search(1, start, end);
			start = segment.searchIndex(1, start, end) + 1;
			end++;
			System.out.print(t + " ");
		}
	}
	private static class Segment{
		Node[] tree;
		private class Node{
			int l,r;
			int max;
			int maxIndex;
		}
		public Segment(int n,int[] input) {
			tree = new Node[4*n+1];
			for(int i=1;i<=4*n;i++)
				tree[i] = new Node();
			build(1,1,n,input);
			return ;
		}
		public void build(int n,int l,int r,int[] input) {
			tree[n].l = l;
			tree[n].r = r;
			if(l == r) {
				tree[n].max = input[l];
				tree[n].maxIndex = l;
				return ;
			}
			int mid = l + (r - l)/2;
			build(2*n,l,mid,input);
			build(2*n+1,mid+1,r,input);
			tree[n].max = Math.max(tree[2*n].max, tree[2*n+1].max);
			if(tree[2*n].max >= tree[2*n+1].max) tree[n].maxIndex = tree[2*n].maxIndex;
			else tree[n].maxIndex = tree[2*n+1].maxIndex;
			return ;
		}
		public int search(int n,int l,int r) {
			if(tree[n].l >= l && tree[n].r <= r) {
				return tree[n].max;
			}
			if(tree[n].l > r || tree[n].r < l) return 0;
			int t = 0;
			if(tree[2*n].r >= l) t = search(2*n,l,r);
			if(tree[2*n+1].l <= r) t = Math.max(t,search(2*n+1,l,r));
			return t;
		}
		public int searchIndex(int n,int l,int r) {
			if(tree[n].l >= l && tree[n].r <= r) {
				return tree[n].maxIndex;
			}
			if(tree[n].l > r || tree[n].r < l) return 0;
			int t = 0;
			int t1 = 0;
			if(tree[2*n].r >= l) t = search(2*n,l,r);
			if(tree[2*n+1].l <= r) t1 = search(2*n+1,l,r);
			if(t >= t1) return searchIndex(2*n,l,r);
			else return searchIndex(2*n+1,l,r);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值