题解:士兵排列

Description

军士长Johnny手下一共有n个士兵,每个士兵按照身高从矮到高编号为1到n。可惜这群士兵太笨了,第一次排好后现在又忘记怎么排了。站在Johnny面前的士兵虽然排成了一列,但是顺序就不一定是从1到n了。

Johnny想了如下的一个办法让他们排列整齐: 从最前面的士兵开始,每个士兵一直往前排直到碰到一个编号比自己小的士兵(身高小于自己)为止,然后该士兵就站在这个位置。不一会儿,队伍调整好了。 Johnny觉得很满意,不过为了提高效率,他要士兵们记住,这次调整的过程中,每个人各自往前走了几个人的位置。 现在给你这样一个任务:告诉你在排队过程中每个人往前走了几个人的位置,请你告诉我最初这个队伍的顺序是怎样的。

Input

输入第一行包含一个正整数n(1 ≤ n ≤ 200000),代表士兵个数。
第二行一共n个整数,第i个数代表原来队伍中排在第i个位置的人在调整过程中往前走了几个人的位置。

Output

输出包含一行,共n个整数,从左往右第i个数代表最初在队伍中第i个人的编号。相邻两个整数用一个空格隔开。

复制代码
5 
0 
复制代码
1 2 0 1 
Sample Input
复制代码
3 2 1 5 4
Sample Output
HINT

【数据限制】

有10%的数据,n不超过10。

有30%的数据,n不超过1000。

时间限制为1秒,空间限制为256MB。

思路:

模拟,树状数组优化

代码:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;

class BIT {
private:
    vector<int> tree;
    int size;
public:
    BIT(int n) : size(n), tree(n + 1, 0) {}
    void update(int idx, int delta) {
        while (idx <= size) {
            tree[idx] += delta;
            idx += idx & -idx;
        }
    }
    int query(int idx) {
        int sum = 0;
        while (idx > 0) {
            sum += tree[idx];
            idx -= idx & -idx;
        }
        return sum;
    }
    int findKth(int k) {
        int low = 1, high = size, ans = 0;
        while (low <= high) {
            int mid = (low + high) / 2;
            int s = query(mid);
            if (s >= k) ans = mid,high = mid - 1;
			else low = mid + 1;
        }
        return ans;
    }
};
signed main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) {
        cin >> a[i];
    }
    BIT bit(n);
    for (int i = 1; i <= n; i ++) bit.update(i, 1);
    vector<int> res(n + 1, 0);
    for (int i = n; i >= 1; i --) {
        int k = i - a[i - 1];
        int x = bit.findKth(k);
        res[i] = x;
        bit.update(x, -1);
    }
    for (int i = 1; i <= n; i ++) {
        if (i > 1) cout << ' ';
        cout << res[i];
    }
    return 0;
}
相关推荐
HAH-HAH3 小时前
【蓝桥杯 2024 国 Java A】粉刷匠小蓝
c++·学习·数学·算法·职场和发展·蓝桥杯·组合数学
得意霄尽欢3 小时前
Redis之底层数据结构
数据结构·数据库·redis
I'm a winner4 小时前
第五章:Python 数据结构:列表、元组与字典(二)
数据结构·python
我是是是是是西红柿4 小时前
游戏中的展销系统使用的数据结构
数据结构·游戏
小吴同学·4 小时前
OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】
c++·wxwidgets
边疆.4 小时前
【C++】继承详解
开发语言·c++·继承
hweiyu004 小时前
C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
c++·算法·设计模式
爱吃烤鸡翅的酸菜鱼5 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
大千AI助手5 小时前
粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
人工智能·算法·优化算法·pso·粒子群优化
十年编程老舅5 小时前
‌C++左值与右值:从基础概念到核心应用‌
linux·c++·右值引用·c++17·c++左值·c++右值·左值引用