Problem - D - Codeforces
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=5e5+10;
vector< pair<int,int> > g[N];
int b[N];
int ans[N];
int main()
{
int t;
cin>>t;
while(t--)
{
priority_queue<pair<int,int>,vector< pair<int,int> >,greater<pair<int,int> > > que;
int n;
cin>>n;
for(int i=1; i<=n; i++) g[i].clear();//每组都要清空
for(int i=1; i<=n; i++)
{
cin>>b[i];
int l,r;
if(b[i]==0)//求出每个区间的取值范围
{
l=i+1;
r=n;
g[l].push_back({r,i});
}
else
{
l=i/(b[i]+1)+1;
r=i/b[i];
g[l].push_back({r,i});
}
}
for(int i=1; i<=n; i++)
{
for(int j=0; j<g[i].size(); j++)//按照左端点的从小到大,右端点的从小到大进行遍历
{ //同一个l,按照r的大小进行遍历,区间小的先赋值,这样保证都有解
que.push(g[i][j]);
}
pair<int,int> t=que.top();
que.pop();
ans[t.second]=i;//每个区间进行赋值
}
for(int i=1;i<=n;i++)//打印每个区间的编号
{
if(i==n) printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
}
return 0;
}