Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)

12986 단어 Codeforces
B
아 이 디 어 는 첫 번 째 입력 을 처리 한 후에 두 번 째 입력 부터 시작 하 는 것 입 니 다. 현재 입력 이 이전 입력 보다 크 면 출력 은 이 입력 과 같 고 사용 되 지 않 은 숫자 를 c 에 존재 하 며 end 는 배열 의 끝 을 가리 키 며 숫자 를 저장 합 니 다.현재 입력 이 이전 입력 과 같다 면 c 배열 의 맨 앞 에 사용 되 지 않 은 숫자 를 출력 합 니 다. begin 은 배열 의 시작 을 가리 키 며 숫자 를 가 져 오 는 데 사 용 됩 니 다.마지막 으로 함께 출력 을 시작 하면 시간 이 초과 되 고 순환 하면 서 출력 이 지나 갑 니 다.
#include 
using namespace std;
typedef long long ll;
 bool flag;
 int a[100010];
 int b[100010];
 int c[100010];
int main(){
 ios::sync_with_stdio(false);
 cout.tie(NULL);
 int t;
 cin>>t;
 while(t--){
  int n;
  cin>>n;
  
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  flag=true;
  for(int i=1;i<=n;i++){
   cin>>a[i];
   if(a[i]<i){
    flag=false;
    string s;
    getline(cin,s);//      continue            
    break;
   }
  }
   int num;
   int begin=1;
   int end=1;
  if(flag==false){
   cout<<"-1";
  }
  else{
   b[1]=a[1];
   cout<<b[1]<<' ';
   if(a[1]>1){
    for(int i=1;i<a[1];i++){
    c[i]=i;
    }
    begin=1;
    end=a[1]-1;
   }
   else end=0;
   for(int i=2;i<=n;i++){
    if(a[i-1]<a[i]){
     b[i]=a[i];
     cout<<b[i]<<' ';
     for(int j=a[i-1]+1;j<a[i];j++){
      c[end+j-a[i-1]]=j;
     }
     end+=a[i]-a[i-1]-1;
    }
    else{
     b[i]=c[begin];
     cout<<b[i]<<' ';
     begin++;
     } 
   }
  }
  cout<<endl;
 }
 return 0;
}

좋은 웹페이지 즐겨찾기