藍橋杯模擬賽——晚會節目單(線段樹)

題目
【問題描述】
小明要組織一臺晚會,總共準備了 n 個節目。然後晚會的時間有限,他只能最終選擇其中的 m 個節目。
這 n 個節目是按照小明設想的順序給定的,順序不能改變。
小明發現,觀衆對於晚會的喜歡程度與前幾個節目的好看程度有非常大的關係,他希望選出的第一個節目儘可能好看,在此前提下希望第二個節目儘可能好看,依次類推。
小明給每個節目定義了一個好看值,請你幫助小明選擇出 m 個節目,滿足他的要求。
【輸入格式】
輸入的第一行包含兩個整數 n, m ,表示節目的數量和要選擇的數量。
第二行包含 n 個整數,依次爲每個節目的好看值。
【輸出格式】
輸出一行包含 m 個整數,爲選出的節目的好看值。
【樣例輸入】
5 3
3 1 2 5 4
【樣例輸出】
3 5 4
【樣例說明】
選擇了第1, 4, 5個節目。
【評測用例規模與約定】
對於 30% 的評測用例,1 <= n <= 20;
對於 60% 的評測用例,1 <= n <= 100;
對於所有評測用例,1 <= n <= 100000,0 <= 節目的好看值 <= 100000。

 坑點:最重要的是紅色字體部分,意思就是求出n個樹中選m個,相對順序不變,求字典序最大的;由此第一個數肯定要在區間[1,n-m+1]中選擇最大的那個數,因爲要保證後面還剩下至少m-1個數纔可,以此類推,選第二個數也要遵循這樣的原則。這樣就要求不定區間的最大值,線段樹。

 

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
struct node{
	int l,r,maxn;//maxn 表示區間[l,r]最大值的下標
}a[400010];
int ans[100010];
int data_s[100010];
void update(int k){
	if(data_s[a[k<<1].maxn]>=data_s[a[k<<1|1].maxn]){//注意比較的對象
		a[k].maxn=a[k<<1].maxn;
	} 
	else a[k].maxn=a[k<<1|1].maxn;
}
void build(int k,int l,int r){
	a[k].l=l;
	a[k].r=r;
	if(l==r){
		a[k].maxn=l;
		return ;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	update(k);
}
int query(int k,int l,int r){
	if(a[k].l>=l&&a[k].r<=r){
		return a[k].maxn;
	}
	int maxn=0;
	int mid=(a[k].l+a[k].r)>>1;
    //最好使用三段式//判斷mid 和區間的三個關係
	if(mid>=l&&mid<r){// 1
		int left=query(k<<1,l,mid);
        int right=query(k<<1|1,mid+1,r);
		if(data_s[left]>=data_s[right])maxn=left;
        else maxn=right;
        return maxn;
	}
	if(mid<l){// 2
		return query(k<<1|1,l,r);
	}
    if(mid>=r)return query(k<<1,l,r);// 3
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>data_s[i];
	}
	build(1,1,n);
    ans[0]=0;
	for(int k=1;k<=m;k++){
		ans[k]=query(1,ans[k-1]+1,n-(m-k));//每次能訪問的區間是[ans[k-1]+1,n-(m-k)];
	}
	for(int i=1;i<=m;i++){
		if(i==m)cout<<data_s[ans[i]]<<endl;
		else cout<<data_s[ans[i]]<<" ";
	}
    system("pause");
	return 0;
}
//            /\       |  /  |**、
//			 /  \      | /   |   \
//			/    \     |/    |   /  _____                      ____   |  /
//		   /------\    |\    |__/  /     \  \      /\      /  /    \  | /
//		  /        \   | \   |    /       \  \    /  \    /  /______\ |/
//		 /          \  |  \  |    \       /   \  /    \  /   \        |
//      /            \ |   \ |     \_____/     \/      \/     \_____  |
/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ Code is far away from bug with the animal protecting          
 *          ┃   ┃   神獸保佑,代碼無bug
 *          ┃   ┃           
 *          ┃   ┃        
 *          ┃   ┃
 *          ┃   ┃           
 *          ┃   ┗━━━┓
 *          ┃       ┣┓
 *          ┃       ┏┛
 *          ┗┓┓┏━┳┓┏┛
 *           ┃┫┫ ┃┫┫
 *           ┗┻┛ ┗┻┛
 */
// warm heart, wagging tail,and a smile just for you!
//
//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\  =  /O
//                        ____/`---'\____
//                      .'  \|     |//  `.
//                     /  \|||  :  |||//  \
//                    /  _||||| -:- |||||-  \
//                    |   | \\  -  /// |   |
//                    | \_|  ''\---/''  |   |
//                    \  .-\__  `-`  ___/-. /
//                  ___`. .'  /--.--\  `. . __
//               ."" '<  `.___\_<|>_/___.'  >'"".
//              | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//              \  \ `-.   \_ __\ /__ _/   .-` /  /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章