/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Wrong Answer 2ms 524.0 KiB
#3 Wrong Answer 1ms 324.0 KiB

Code

#include <bits/stdc++.h>
using namespace std;
#define SC               scanf
#define PF               printf
#define ull              unsigned long long
#define ld               long double
#define F                first
#define S                second
#define pb               push_back
#define sort_a(a)        sort(a.begin(),a.end());
#define sort_d(a)        sort(a.rbegin(),a.rend());
#define READ(f)          freopen(f, "r", stdin)
#define WRITE(f)         freopen(f, "w", stdout)
#define rev(s)           reverse(s.begin(),s.end())
#define P(ok)            cout << (ok ? "YES\n": "NO\n")
#define __Heart__              ios_base :: sync_with_stdio(false); cin.tie(NULL);
#define ll long long
typedef pair< ll , ll>                   PII;
void solve()
{
  ll n; cin >> n ; ll c[n + 5] , Ans[n + 5] ;
  for(int i = 1 ; i <= n ; i++) cin >> c[i] , Ans[i] = 1;
  if(c[1]) {
    cout << "NO\n" ;
    return ;
  }
  ll i = 2 , prev = -1 , starting = 1 , adding = 1 ;
  while(i <= n){
    if(c[i] == 0 && prev == -1){
        i += 2 ;
        continue ;
    }
    if(c[i]){
        prev = c[i] ;
        int cur = c[i] ;
        starting += c[i] ;
        Ans[i] = starting ;
        adding = starting - 1 ;
        i += 2 ;
        while(cur--){
         if(i > n){
          cout << "NO\n" ;
          return ;
         }
         if(c[i]) {
            cout << "NO\n" ;
            return ;
         }
         Ans[i] = adding;
         i += 2 ;
        }
    }
    else{
       Ans[i] = starting++ ;
       i += 2 ;
    }

  }

  //-------------------------------//
  starting = adding = 1 ;
  for(ll i = 3 ; i <= sqrt(n) ; i += 2){
    prev = -1 ;
   ll j = 1 ;
   while(i * j <= n){
    if(c[i * j] == 0 && prev == -1){
        j = i * j  ;
        continue ;
    }
    if(c[i * j]){
        prev = c[i * j] ;
        int cur = c[i * j] ;
        starting += c[i * j] ;
        Ans[i * j] = starting ;
        adding = starting - 1 ;
        j = i * j  ;
        while(cur--){
            if(j * i > n){
                cout << "NO\n" ;
                return ;
            }
            if(c[i * j]){
                cout << "NO\n" ;
                return ;
            }
            Ans[i * j] = adding ;
            j = i * j ;
        }
    }
    else {
        Ans[i * j] = starting++ ;
        j = i * j ;
    }
   }
  }
  cout << "YES\n" ;
  for(int i = 1 ; i <= n ; i++) cout << Ans[i] << " " ; cout << "\n" ;

}
int main()
{
     __Heart__
     int t ; cin >> t ; while(t--) solve() ;
}

Information

Submit By
Type
Submission
Problem
P1163 Roy and Array Construction
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-07 18:20:24
Judged At
2025-02-08 16:52:14
Judged By
Score
2
Total Time
2ms
Peak Memory
532.0 KiB