/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 197ms 39.746 MiB
#2 Wrong Answer 206ms 39.855 MiB
#3 Wrong Answer 199ms 39.738 MiB

Code

// Authored by Ibrahimfostok...
// Next level : "Master"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
// const ll mod = 1e9 + 7;
#define gcd __gcd
#define int ll
#define ld long double
#define lcm(a, b) (a * b / gcd(a, b))
#define ceil(x, y) (((x) + (y) - 1ll) / (y))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define MOD(x) x = ((x % mod) + mod) % mod
const long double pi = 3.14159265358979323846;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll rand(ll L, ll R)
{
    return uniform_int_distribution<ll>(L, R)(rng);
}
//
int s = 1e6;
vector<int> T;
void update(int i, int val, int x = 1, int l = 1, int r = s)
{
    if (i < l || r < i)
        return;
    if (l == r)
    {
        T[x] = val;
        return;
    }
    int mid = (l + r) / 2;
    update(i, val, x * 2, l, mid);
    update(i, val, x * 2 + 1, mid + 1, r);
    T[x] = T[x * 2] + T[x * 2 + 1];
}
int query(int i, int j, int x = 1, int l = 1, int r = s)
{
    if (r < i || j < l)
        return 0;
    if (i <= l && r <= j)
        return T[x];
    int mid = (l + r) / 2;
    int q1 = query(i, j, 2 * x, l, mid);
    int q2 = query(i, j, 2 * x + 1, mid + 1, r);
    return q1 + q2;
}

vector<int> minp, primes;
void sieve(int n)
{
    minp.assign(n + 1, 0);
    primes.clear();

    for (int i = 2; i <= n; i++)
    {
        if (minp[i] == 0)
        {
            minp[i] = i;
            primes.push_back(i);
        }

        for (auto p : primes)
        {
            if (i * p > n)
            {
                break;
            }
            minp[i * p] = p;
            if (p == minp[i])
            {
                break;
            }
        }
    }
}
void My_Solve(int TC)
{
    // cout << setprecision(10) << fixed;
    int n;
    cin >> n;
    vector<int> a(n), v[n + 1], ans(n, 1);
    for (int i = 0; i < n; i++)
        cin >> a[i], v[minp[i + 1]].pb(i);
    for (int i = 1; i <= n; i++)
        if (v[i].size())
        {
            int m = v[i].size();
            for (int j = 0; j < m; j++)
                if (a[v[i][j]] > m - j - 1)
                {
                    cout << "No\n";
                    return;
                }
            ans[v[i].back()] = 5e5;
            update(5e5, 1);
            for (int j = m - 2; j >= 0; j--)
            {
                int l = 1, r = 1e6;
                while (l + 1 < r)
                {
                    int mid = (l + r) / 2;
                    if (query(1, mid - 1) <= a[v[i][j]])
                        l = mid;
                    else
                        r = mid;
                }
                if (query(1, l - 1) != a[v[i][j]])
                {
                    cout << "No\n";
                    return;
                }
                update(l, query(l, l) + 1);
                ans[v[i][j]] = l;
            }
        }
    cout << "Yes\n";
    for (auto &x : ans)
        cout << x << " ", update(x, 0);
    cout << '\n';
}
int32_t main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    T.resize(4e6);
    for (int i = 1; i <= s; i++)
        update(i, 0);
    sieve(1e6);
    int t = 1;
    cin >> t;
    for (int i = 1; i <= t; i++)
        My_Solve(i);
    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 16:12:18
Judged At
2025-02-17 16:12:18
Judged By
Score
2
Total Time
206ms
Peak Memory
39.855 MiB