真的疯了,线段树 wa #9 求调
查看原帖
真的疯了,线段树 wa #9 求调
378467
Windy_YY楼主2023/8/25 08:32
#include <bits/stdc++.h>
#define int long long
#define destroy printf("NO"), exit(0)
using namespace std;
const int N = 2e5 + 10;
int a[N], l[N], r[N], cnt[N];
namespace Sgt1
{
    struct Node
    {
        int l, r;
        int mi;
        void init(int p)
        {
            l = r = p;
            if (a[p]) mi = a[p];
            else mi = 1e18;
        }
    } z[N << 2];
    Node operator+(const Node &lhs, const Node &rhs)
    {
        Node res;
        res.l = lhs.l, res.r = rhs.r;
        res.mi = min(lhs.mi, rhs.mi);
        return res;
    }
    void build(int l, int r, int rt)
    {
        if (l == r)
            return (void)z[rt].init(l);
        int mid = l + r >> 1;
        build(l, mid, rt << 1);
        build(mid + 1, r, rt << 1 | 1);
        z[rt] = z[rt << 1] + z[rt << 1 | 1];
    }
    int query(int l, int r, int rt, int nowl, int nowr)
    {
        if (nowl <= l && r <= nowr)
            return z[rt].mi;
        int mi = 1e18, mid = l + r >> 1;
        if (nowl <= mid) mi = min(mi, query(l, mid, rt << 1, nowl, nowr));
        if (mid < nowr) mi = min(mi, query(mid + 1, r, rt << 1 | 1, nowl, nowr));
        return mi;
    }
}
namespace Sgt2
{
    struct Node
    {
        int l, r;
        int sum, tag;
        void init(int p)
        {
            l = r = p;
            sum = tag = 0;
        }
        void color(int p)
        {
            sum = p, tag = p;
        }
    } z[N << 2];
    Node operator+(const Node &lhs, const Node &rhs)
    {
        Node res;
        res.l = lhs.l, res.r = rhs.r;
        res.sum = lhs.sum + rhs.sum;
        res.tag = 0;
        return res;
    }
    void build(int l, int r, int rt)
    {
        if (l == r)
            return (void)z[rt].init(l);
        int mid = l + r >> 1;
        build(l, mid, rt << 1);
        build(mid + 1, r, rt << 1 | 1);
        z[rt] = z[rt << 1] + z[rt << 1 | 1];
    }
    void push_down(int rt)
    {
        if (z[rt].tag)
        {
            z[rt << 1].color(z[rt].tag);
            z[rt << 1 | 1].color(z[rt].tag);
            z[rt].tag = 0;
        }
    }
    void modify(int l, int r, int rt, int nowl, int nowr, int val)
    {
        if (nowl <= l && r <= nowr)
            return (void)z[rt].color(val);
        int mid = l + r >> 1;
        push_down(rt);
        if (nowl <= mid) modify(l, mid, rt << 1, nowl, nowr, val);
        if (mid < nowr) modify(mid + 1, r, rt << 1 | 1, nowl, nowr, val);
        z[rt] = z[rt << 1] + z[rt << 1 | 1];
    }
    int query(int l, int r, int rt, int nowl, int nowr)
    {
        if (nowl <= l && r <= nowr)
            return z[rt].sum;
        int mid = l + r >> 1, sum = 0;
        push_down(rt);
        if (nowl <= mid) sum += query(l, mid, rt << 1, nowl, nowr);
        if (mid < nowr) sum += query(mid + 1, r, rt << 1 | 1, nowl, nowr);
        return sum;
    }
}
signed main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int alloc = 0;
    for (int i = 1; i <= n; i++)
        if (a[i])
            alloc++;
    if (alloc)
    {
        memset(l, 0x3f, sizeof l);
        for (int i = 1; i <= n; i++)
        {
            l[a[i]] = min(l[a[i]], i);
            r[a[i]] = max(r[a[i]], i);
            cnt[a[i]]++;
        }
        if (!cnt[m] && alloc == n) destroy;
        Sgt1::build(1, n, 1);
        for (int i = 1; i <= m; i++)
            if (cnt[i] && Sgt1::query(1, n, 1, l[i], r[i]) < i)
                destroy;
        Sgt2::build(1, n, 1);
        for (int i = 1; i <= m; i++)
            if (cnt[i])
                Sgt2::modify(1, n, 1, l[i], r[i], i);
        for (int i = 1; i <= n; i++) a[i] = Sgt2::query(1, n, 1, i, i);
        int p1 = -1, p2 = -1;
        cout << "YES\n";
        int pn = 0;
        for (int i = 1; i <= n; i++)
            if (!a[i])
                pn++;
        for (int i = 1; i <= n; i++)
            if (!a[i] && !cnt[m] && pn)
            {
                a[i] = m;
                break;
            }
        for (int i = 1; i <= n; i++)
            if (a[i])
            {
                p1 = i; 
                break;
            }
        for (int i = n; i; i--)
            if (a[i])
            {
                p2 = i;
                break;
            }
        for (int i = 1; i < p1; i++) a[i] = a[p1];
        for (int i = p2 + 1; i <= n; i++) a[i] = a[p2];
        for (int i = 1; i <= n; i++)
            if (!a[i])
            {
                if (i != n || !a[i + 1])
                    a[i] = a[i - 1];
                else
                    a[i] = max(a[i - 1], a[i + 1]);
            }
        for (int i = 1; i <= n; i++) cout << a[i] << ' ';
        cout << '\n';
    }
    else
    {
        cout << "YES\n";
        for (int i = 1; i <= n; i++)
            cout << m << ' ';
        cout << '\n';
    }
    return 0;
}
2023/8/25 08:32
加载中...