/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 7ms 2.32 MiB
#2 Accepted 8ms 2.52 MiB
#3 Accepted 8ms 2.527 MiB
#4 Accepted 18ms 2.52 MiB
#5 Accepted 67ms 3.148 MiB
#6 Accepted 207ms 9.02 MiB
#7 Accepted 238ms 24.707 MiB
#8 Accepted 176ms 24.828 MiB
#9 Accepted 143ms 21.957 MiB
#10 Accepted 236ms 24.805 MiB
#11 Accepted 165ms 11.586 MiB
#12 Accepted 195ms 6.656 MiB
#13 Accepted 77ms 3.391 MiB
#14 Accepted 70ms 3.051 MiB
#15 Accepted 219ms 22.207 MiB
#16 Accepted 217ms 22.207 MiB
#17 Accepted 218ms 22.203 MiB
#18 Accepted 216ms 4.488 MiB
#19 Accepted 209ms 4.617 MiB
#20 Accepted 151ms 6.625 MiB

Code

#include <bits/stdc++.h>
using namespace std;

const int MAX = 5e5;

int SPF[MAX + 5];

void update(int i, int val, vector<int> &BIT)
{
    for (; i < BIT.size(); i += (i & (-i)))
        BIT[i] += val;
}

int query(int i, vector<int>& BIT)
{
    int res = 0;
    
    for (; i > 0; i -= (i & (-i)))
        res += BIT[i];
    
    return res;
}

int solve(vector< pair<int, int> > &X, vector<int> &F)
{
    vector<int> BIT(X.size() + 1);
    
    for (int i = 1; i <= X.size(); i++)
        update(i, 1, BIT);
    
    for (auto &pr: X)
    {
        int indx = pr.first, target = pr.second + 1;
        
        int left = 1, right = X.size(), res = -1;
        
        while (left <= right)
        {
            int mid = (left + right) / 2;
            
            if (query(mid, BIT) >= target)
                res = mid, right = mid - 1;
            else
                left = mid + 1;
        }
        
        if (res == -1)
            return 1;
        
        F[indx] = res;
        update(res, -1, BIT);
    }
    
    return 0;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL), cout.tie(NULL);
    
    int t;
    cin >> t;
    
    SPF[1] = 1;
    
    for (int i = 2; i <= MAX; i++)
        if (SPF[i] == 0)
            for (int j = i; j <= MAX; j += i)
                if (SPF[j] == 0)
                    SPF[j] = i;
    
    while (t--)
    {
        int n;
        cin >> n;
        
        vector< vector< pair<int, int> > > X(n + 1);
        
        for (int i = 1; i <= n; i++)
        {
            int c;
            cin >> c;
            
            X[ SPF[i] ].push_back({i, c});
        }
        
        int f = 0;
        vector<int> F(n + 1);
        
        for (int i = 1; i <= n; i++)
            if (!X[i].empty())
                f |= solve(X[i], F);
        
        if (f)
        {
            cout << "No\n";
            continue;
        }
        
        cout << "Yes\n";
        
        for (int i = 1; i <= n; i++)
            cout << F[i] << " ";
        cout << "\n";
    }
    
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1163 Roy and Array Construction
Contest
Brain Booster #8
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 15:27:22
Judged At
2025-02-17 15:27:22
Judged By
Score
100
Total Time
238ms
Peak Memory
24.828 MiB