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;
}
相关推荐
谢亮_vipxieliang1 小时前
GC 入门:G1 与 ZGC 怎么选
java·jvm·算法
兔小盈1 小时前
有效三角形个数与和为s的两个数字
算法·双指针
海上小飞龙10 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂10 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i10 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息12 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.13 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕13 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng13 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法