題目
【問題描述】
小明要組織一臺晚會,總共準備了 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
// ____/`---'\____
// .' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//