AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 5985. AcWing 5985. 封印宝石    原题链接    简单

作者: 作者的头像   hanxin233 ,  2025-06-10 22:23:06 · 山西 ,  所有人可见 ,  阅读 2


0


//首先是从贪心的角度解决了,只要能把能量可以遍历到的区间放在最前面,那就可以产生
//字典序最大。在由于能量是变化的,所以区间查询也是动态的。
//并且某个元素放置完之后,还得在区间内删除,防止被重复选择,所以要单点修改。

实现的时候注意这是严格最大值。要去除重复元素,本来想用unique,但是存的是pii,所以只能手动查找了。

#include<bits/stdc++.h>
//首先是从贪心的角度解决了,只要能把能量可以遍历到的区间放在最前面,那就可以产生
//字典序最大。在由于能量是变化的,所以区间查询也是动态的。
//并且某个元素放置完之后,还得在区间内删除,防止被重复选择,所以要单点修改。

using namespace std;
using ll =long long;
using pii = pair<int,int>;
const int N = 1e5+3;
int a[N];
int n,k;
struct Node{
    int l,r;
    int v,nv;
    int vi,nvi;
    //注意这里的次大值,是严格次大值。
}tr[N*4];

void push_up(Node &u,Node &l,Node &r){
    //重新封装一下push_up有利于合并
    pii temp[4]={
        {l.v,l.vi},
        {l.nv,l.nvi},
        {r.v,r.vi},
        {r.nv,r.nvi}};
    sort(temp,temp+4,[&](pii a,pii b){
        if(a.first==b.first)
            //消耗的能量少
            return a.second<b.second;
        return a.first>b.first;
    });
    int size_=1;
    u.v=temp[0].first,u.vi=temp[0].second;
    u.nv=0,u.nvi=0;
    for(int i=0;i<3;i++){
        if(temp[i].first!=temp[i+1].first){
            u.nv=temp[i+1].first,u.nvi=temp[i+1].second;
            break;
        }
    }
}

void push_up(int u){
    push_up(tr[u],tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r){
    tr[u]={l,r};
    if(l==r){
        tr[u].v=a[l],tr[u].vi=l;
        return ;
    }
    int mid=(l+r)/2;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    push_up(u);
}
Node query(int u,int ql,int qr){
    int l=tr[u].l,r=tr[u].r;
    if(l>=ql&&r<=qr)return tr[u];
    int mid = (l+r)/2;
    Node res={0,0,0,0,0,0};
    if(ql<=mid)res=query(u<<1,ql,qr);
    if(qr>mid){
        Node t=query(u<<1|1,ql,qr);
        push_up(res,res,t);
    }
    return res;
}
void modify(int u,int x){
    int l=tr[u].l,r=tr[u].r;
    if(tr[u].l==x&&tr[u].r==x){
        Node temp={x,x,0,0,0,0};
        tr[u]=temp;
        return ;
    }
    int mid=(l+r)/2;
    if(x<=mid)modify(u<<1,x);
    if(x>mid)modify(u<<1|1,x);
    push_up(u);
}
int ans[N];
int main(){
    memset(ans,-1,sizeof ans);
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=n;i++){
        int r=i+k;
        Node q_n=query(1,i,r);
        if(q_n.v==0)continue;
        if(q_n.v!=ans[i-1]){
            ans[i]=q_n.v;
            modify(1,q_n.vi);
            k-=(q_n.vi-i);
        }
        if(q_n.v==ans[i-1]&&q_n.nv!=0){
            ans[i]=q_n.nv;
            modify(1,q_n.nvi);
            k-=(q_n.nvi-i);
        }
    }

    for(int i=1;i<=n;i++){
        cout<<ans[i]<<" ";
    }
    return 0;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息