[リンクのタイトル] Bのタイトルのリンク
タイトルアナログタイプ
[タイトル]効果あなた期間の長さのシーケンスN、Q1、Q2、Q3、Q4 ... QN のないこのシーケンスは、P1、P2 ... PNによって生成された、唯一の1からnの番号P1、P2 ... PNそれらがあるが、以下の操作により、複製されます得
Q1を= P1、
Q2 = MAX(P1、P2)、
Q3 = MAX(P1、P2、P3)、
...
Qnは= MAX(P1、P2、...、PNを)。
今要求あなたは、P1、P2を解く... PN(多くの場合に存在する可能性のp系列、あなたはどちらか解決することができます)
対象が試料溶液プロセス1与えられているため、最初に、我々は、サンプルのいくつかの分析を実行するために開始することができる[アイデアが問題解決]
INPUT
5
1 3 5 4
Q1 = P1 = 1、
Q2 = MAX(P1、P2 )= 3;
Q3 = MAX(P1、P2、P3)= 4;
Q4 = MAX(P1、P2、P3、P4)= 5;。
。。Q5 = MAX(P1、P2、P3、P4、P5)= 5
可能性解決
- P1 = 1
- だから、P2 = 3;最大(P1、P2)= 3以来
- 最大ので(P1、P2、P3)= 4したがって、P3 = 4
- (P1、P2、P3、P4)MAXので= 5したがって、P4 = 5
- (P1、P2、P3、最大以来 P4、P5)= 5 およびP4 = 5、及びわずか2シーケンスで発生していなかった、それだけで2 P5がある
ために解決し
、出力
。1 2. 5. 4. 3
(これは答えの出でありますデータ出力の外観は-1ものですので場合は、タイトルは、それが答えの存在になると出てこない場合もある
INPUTは
4
1 1 3 4
明らかに、このデータは、P1、P2は1です表示されます場合、次に、シーケンス番号が満たさない条件ない重なり合うように出力-1
上記のデータは明らかに、知ることができるデータのニーズも大きく早く発生することが(良くないかもしれませんI発現を、この言葉の意味を理解してみてください)
のように
5
3 3 5 5 5
その後、私ができるシーケンスある
I 5は、私は私たちが配置された必要がある、5の後に得られた最大値を確保したいので、次の3つがあり、32541
ANS私の答え配列は、それがある
が表示されますが繰り返されていない、私は答えから雑草への変数セットを宣言すること数はデジタルアレイ内で浮上していることを確認するために、(1)
(2)●配列は、私のタイトルは言うですデータ入力受信するためのqアレイ
IのQ [I]> P [I場合(3) ] が直接I qは[I]が配列に私が答えをANS、およびIの数か否かを判断することP qを除去するために、容器内のP SETが登場[i]の値、すなわちp.earse(Q [i])と、
(4)最後に、残りのpの数は、それに入れANS我々ため可能フォワード行の数が多い、満たされている
ワシントン州(5)が3〜5例このサンプル試みることができる
5
。3 3 5 5
/**
* This code has been written by YueGuang, feel free to ask me question. Blog: http://www.yx.telstudy.xyz
* created:
*/
#include <cstdio>
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#define rep(i, a, b) for(int i = a; i < b; i++)
#define rep_(i, a, b) for(int i = a; i <= b; i++)
#define rep(i, n) for(int i = 0; i < n; i++)
#define rep1(i, n) for(int i = 1; i < n; i++)
#define rep_(i, n) for(int i = 0; i <= n; i++)
#define rep1_(i, n) for(int i = 1; i <= n; i++)
#define pb(x) push_back(x);
#define si(x) scanf("%d", &x);
#define sl(n) scanf("%lld", &n);
#define si(n) scanf("%d", &n);
#define RepAll(a) for(auto x: a)
#define cout(ans) cout << ans << endl;
typedef long long ll;
using namespace std;
const int maxn = 1e5+50;
set<int> p;
int q[maxn], ans[maxn];
int main(){
int t; si(t);
while(t--){
bool isflag = true;
int n; si(n);
rep1_(i, n){ si(q[i]);}
p.clear();
rep1_(i, n){ p.insert(i); }
rep1_(i, n){
if(q[i] < q[i - 1]){ isflag = false; break;}
if(q[i] > q[i - 1]){ ans[i] = q[i]; p.erase(q[i]);}
else{
if ((*p.begin()) < q[i]){
ans[i] = (*p.begin());
p.erase(*p.begin());
}
else{
//如果set中剩余的数字比q[i]还大的话,那很明显是错的,max最后的值就会不符合要求
isflag = false;
break;
}
}
}
if(isflag == false){printf("-1\n"); continue;}
rep1_(i, n){cout << ans[i] << " "; }
}
}
コードが複雑さとスペースの複雑さがあった時点ではなく、より良いアイデアとアイデアがある場合は、コメントを歓迎するか、私のメールボックス[email protected]にメールを送ります