备战蓝桥杯---数据结构与STL应用(入门3)

我们先来一道题作为过渡:

备战蓝桥杯---数据结构与STL应用(入门3)_第1张图片

我们只需枚举n,选出左右第一个小于它高度的坐标即可,于是我们可以用两个方向的优先队列来维护,下面是AC代码:

#include
using namespace std;
#define int long long
int n;
struct node{
    int index,tall;
}a[100010];
int b[100010],b1[100010];
signed main(){
    cin>>n;
    while(n!=0){
        for(int i=1;i<=n;i++){
            cin>>a[i].tall;
            a[i].index=i;
        }
        deque q1;
        deque q2;
        for(int i=1;i<=n;i++){
            while(!q1.empty()&&a[i].tall=1;i--){
            while(!q2.empty()&&a[i].tall>n;
    }
}

这里注意一下:

当两个高度相等时,我们要特殊处理一下,一方面,我们把它们正常添加以保证后面元素不出错。另一方面,他们的值应该定位到第一个出现该高度的值。

接下来,我们主要围绕优先队列来讲:

备战蓝桥杯---数据结构与STL应用(入门3)_第2张图片

下面是分析:

其实这是一个典型的对顶堆,下面是图解:

下面是AC代码:

#include
using namespace std;
int p,m,xu,jj;
int main(){
    cin>>p;
    while(p--){
    priority_queue q1;
    priority_queue,greater > q2;
    cin>>xu>>m;
    cout<=q2.top()) q2.push(jj);
               else q1.push(jj);
           }
           else{
               if(jj<=q1.top()) q1.push(jj);
               else q2.push(jj);
           }
       }
        else{
             if(jj>=q2.top()) q2.push(jj);
               else q1.push(jj);
        }
        if(q1.size()>q2.size()+1){
            q2.push(q1.top());
            q1.pop();
        }
        if(q2.size()>q1.size()+1){
            q1.push(q2.top());
            q2.pop();
        }
        if(i%2==1){
            if(kk==10) {cout<q2.size()) printf("%d ",q1.top());
            else printf("%d ",q2.top());
            kk++;
        }
    }
    if(p!=0) cout<

接下来来个十分好的问题:

备战蓝桥杯---数据结构与STL应用(入门3)_第3张图片

下面为分析:

首先,我们容易想到用贪心,那怎么贪心呢?

其实,我们把每个元素在剩余序列上第一个位置最远的元素替换即可,这样子,我们保证它们会相比其他决策最先遇到与自己一样的值,也保证剩余序列上与缓存上的一样的值相比其他决策最靠前,因此正确性显然。

那我们如何维护呢?先用map把数据离散化,在维护一个next数组,序列上第一个位置最远的元素用优先队列维护即可。

注意,当i遇到重复的j直接加进即可,在j没离开时,i肯定不会在栈顶。j离开后,因为next[i]=j,后加的元素肯定》j,于是i就被一直忽略。

下面是AC代码:

#include
using namespace std;
int n,m,a[100010],tot,next1[100010],cun[100010],cnt,sum;
map mp;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=n;i>=1;i--){
        if(mp.count(a[i])==0) next1[i]=n+1;
        else next1[i]=mp[a[i]];
        mp[a[i]]=i;
    }
    priority_queue q;
    for(int i=1;i<=n;i++){
        if(cun[i]==1){
            q.push(next1[i]);
            cun[next1[i]]=1;
        }
        else{
            if(cnt

你可能感兴趣的:(蓝桥杯,数据结构,c++,算法)