poj2828

本文探讨了一种解决队列插队问题的高效算法。通过使用优先队列和树状数组的数据结构,实现了在复杂场景下快速定位和处理插队行为的功能。详细解释了算法原理、实现步骤,并通过实例演示了其实用性和性能优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:点击打开链接

题意:就是后面人插队的问题,具体如图所示

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int node[200000*3],ans[200000];
int x[200000],y[200000];
void build(int pos,int l,int r,int id,int x){
    int mid;
    if(l==r){
        node[pos]=1;                              //初始时最下空格都为1
        return;
    }
    mid=(l+r)/2;
    if(id<=mid)
    build(2*pos,l,mid,id,x);
    else
    build(2*pos+1,mid+1,r,id,x);
    node[pos]=node[2*pos]+node[2*pos+1];           //更新区间中空格数
}
void question(int pos,int l,int r,int num,int x){
    int mid;
    if(l==r){
        ans[l]=x;node[pos]=0;                       //放入一个数,空格数就清零
        return;
    }
    mid=(l+r)/2;
    if(num<=node[2*pos])
    question(2*pos,l,mid,num,x);
    else
    question(2*pos+1,mid+1,r,num-node[2*pos],x);
    node[pos]=node[2*pos]+node[2*pos+1];            //向上更新    
}
int main(){
    int i,n;
    while(scanf("%d",&n)!=EOF){
        memset(ans,0,sizeof(ans));
        for(i=1;i<=n;i++){
        scanf("%d%d",&x[i],&y[i]);
        build(1,1,n,i,y[i]);
        }
        for(i=n;i>=1;i--)                           //因为后面的数决定了前面
        question(1,1,n,x[i]+1,y[i]);                //的数的位置,所以从后面更新
        for(i=1;i<=n;i++)
        printf("%d ",ans[i]);
        printf("\n");
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值