CF2137D Replace with Occurrences

题目描述

给定一个长度为 n 的序列 b,要求构造出另一个长度为 n 的序列 a,使得对于新序列中每个元素 ai​,满足 ai​ 在 a 中的出现次数恰好为 bi​。要求 1≤ai​≤n。

输入格式

本题有多组测试数据。

第一行一个正整数 T(1≤T≤104) 表示测试数据数量。

随后 2T 行,第 i+1 至 i+2 行为第 i 组测试数据。第 i+1 行一个整数 n(1≤n≤2⋅105),表示 b 的长度,第二行 n 个整数 bi​(1≤bi​≤n),表示 b 序列。

保证 n 的总和不超过 2⋅105。

输出格式

输出答案。若有多个答案,输出任意一个均可。如果不存在答案,输出 -1。

输入输出样例

输入 #1复制

复制代码
3
4
1 2 3 4
6
1 2 2 3 3 3
6
6 6 6 6 6 6

输出 #1复制

复制代码
-1
4 5 5 6 6 6
2 2 2 2 2 2

说明/提示

在第一组测试数据中,没有一个数组 a 符合要求。

在第二组测试数据中, 4,5,6 分别出现了 1,2,3 次,所以 a={4,5,5,6,6,6} 符合要求。

cpp 复制代码
#include "bits/stdc++.h"
#define int long long
using namespace std;
signed main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  //这个记得注释掉
  //freopen("../input.txt","r",stdin);
  int t;
  cin>>t;
  while (t--)
  {
    //cout<<"------------------------\n";
    int n;
    cin>>n;
    vector<int>a(n);
    int maxn=0;
    for (int i=0;i<n;i++)
    {
      cin>>a[i];
      maxn=max(a[i],maxn);
    }
    //邻接表存每个数字出现在哪些位置
    //g[val].push_back(idx);
    vector<vector<int>>g(maxn+1);
    for (int i=0;i<n;i++)
    {
      g[a[i]].push_back(i);
    }
    vector<int>ans(n);
    bool ok=true;//记录有没有解
    int cur=1;//当前填充的数字
    //枚举每一种值
    for (int  val=1;val<=maxn;val++)
    {
      //val在原数组里出现了多少次
      int cnt=g[val].size();
      //判断能不能被完整分组
      if (cnt%val==0)
      {
        for (int i=0;i<cnt;i++)
        {
          //把这些位置每val个分成一组
          //然后让同一组在答案数组里填同一个数
          ans[g[val][i]]=cur+i/val;
        }
        cur+=cnt/val;//更新填充的数字
      }
      else
      {
        ok=false;
        break;
      }
    }
    if (ok)
    {
      for (auto e:ans)
        cout<<e<<" ";
      cout<<"\n";
    }
    else
      cout<<"-1\n";
  }
  return 0;
}
相关推荐
武子康1 天前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
lisw051 天前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术1 天前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs1 天前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057591 天前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
GoAI2 天前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi2 天前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M2 天前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen2 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#