列表

详情


NC205914. 构造数组

描述

构造一个长度为n的数组A,构造方式如下:
初始时数组A为空
依次进行n次操作,第i次操作在数组A的index[i]位置处插入整数number[i].
默认数组下标从1开始
保证数字插入位置总是存在.
最后从左到右输出数组A的元素

输入描述

第一行输入一个正整数n
加下来n行,每行输入两个正整数index[i]和number[i]
n<=500000.
number[i]<=500000
1<=index[i]<=i

输出描述

最后从左到右输出数组A的元素

示例1

输入:

3
1 1
1 2
1 3

输出:

3 2 1

说明:

第1步,在位置1插入整数1,数组A变成[1]
第2步,在位置1插入整数2,数组A变成[2,1]
第3步,在位置1插入整数3,数组A变成[3,2,1]

示例2

输入:

3
1 1
2 2
2 3

输出:

1 3 2

说明:

第1步,在位置1插入整数1,数组A变成[1]
第2步,在位置2插入整数2,数组A变成[1,2]
第3步,在位置2插入整数3,数组A变成[1,3,2]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 465ms, 内存消耗: 11624K, 提交时间: 2020-05-28 21:05:03

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 5e5 + 5;
int ind[maxn], num[maxn], ans[maxn];

int n, sum[maxn];
void Update(int i) {
    while(i <= n) {
        sum[i]++;
        i += i&(-i);
    }
}
int Query(int x) {
    int i = 0, j = 19;
    while(~j) {
        if((i|1<<j) <= n && (i|1<<j)-sum[i|1<<j] < x) {
            i |= 1<<j;
            x += sum[i];
        }
        j--;
    }
    return i+1;
}

int main() {

    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d%d", ind+i, num+i);

    for(int i = n; i; i--) {
        int k = Query(ind[i]);
        ans[k] = num[i];
        Update(k);
    }

    printf("%d", ans[1]);
    for(int i = 2; i <= n; i++) printf(" %d", ans[i]);
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 642ms, 内存消耗: 18016K, 提交时间: 2020-06-29 21:49:31

#include<bits/stdc++.h>
using namespace std;

int i,j,n,a[500005],id[500005],S[500005]={0},ans[500005];
int lowbit(int x)
{
	return x&(-x);
}
void update(int i,int x)
{
	while(i<=n)S[i]+=x,i+=lowbit(i);
}
int getsum(int i)
{
	int s=0;
	while(i)s+=S[i],i-=lowbit(i);
	return s;
}
int find(int x)
{
    int l=1,r=n,mid,ans;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(mid-getsum(mid)<x)l=mid+1;
        else ans=mid,r=mid-1;
    }
    return ans;
}
int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d%d",&id[i],&a[i]);
	for(i=n;i>=1;i--)j=find(id[i]),ans[j]=a[i],update(j,1);
	for(i=1;i<=n;i++)printf("%d ",ans[i]);
}

上一题