poj 2828 Buy Tickets 线段树+小思维

传送门
题目大意,插队的问题,每个案例给出n,代表有n个插队的,每个给出p,v,意思是代号为v的人插在了第p个人的后面,问最后的队伍的排列?

题目中一开始整个队列是空的,也就是说如果输入i,j:代表代号为j的人插在了第i个人的后面,也就是说在他之前一定有了i个人,而他的位置是i+1。

离线存储,倒序更新线段树(因为后来的人好确定位置,而且先到的人的实际位置受后来的人的影响),遍历叶子结点正序输出。
与权值线段树类似的查找,查找从前往后的第k个满足条件的叶子结点。

#include <cstdio>
#include <iostream>

#define mid ((l(p) + r(p))>>1)
using namespace std;

const int N = 2e5 + 50;

struct Node {
    int l, r, num, sp;
#define l(x) c[x].l
#define r(x) c[x].r
#define num(x) c[x].num
#define sp(x) c[x].sp
} c[N << 2];
int t, x[N << 2], n[N << 2];

void pushup(int p) {
    sp(p) = sp(p << 1) + sp(p << 1 | 1);
}

void build(int p, int l, int r) {
    l(p) = l, r(p) = r, num(p) = 0;
    if (l == r) {
        sp(p) = 1;
        return;
    }
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
    pushup(p);
}

void change(int p, int x, int n) {
    if (l(p) == r(p) && sp(p) == 1) {
        num(p) = n;
        sp(p) = 0;
        return;
    }
    if (sp(p << 1) > x) change(p << 1, x, n);
    else change(p << 1 | 1, x - sp(p << 1), n);
    pushup(p);
}

void print(int p) {
    if (l(p) == r(p)) {
        printf("%d%c", num(p), "\n "[t != 1]);
        t--;
    } else {
        print(p << 1);
        print(p << 1 | 1);
    }
    return;
}

int main() {
    while (~scanf("%d", &t)) {
        build(1, 1, t);
        for (int i = 1; i <= t; i++) scanf("%d%d", &x[i], &n[i]);
        for (int i = t; i; i--) change(1, x[i], n[i]);
        print(1);
    }
    return 0;
}

更优质题解见下⬇️

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值