답안 #847535

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
847535 2023-09-09T19:56:39 Z HoriaHaivas RMQ (NOI17_rmq) C++14
23 / 100
2 ms 6492 KB
/*
    "TLE is like the wind, always by my side"
    - Yasuo - 2022 -
*/
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")

using namespace std;

struct qq
{
    int l;
    int r;
    int x;
};

struct ptval
{
    int nr;
    int poz;
};

ptval val[100001];
const int inf=INT_MAX;
qq query[100001];
qq query2[100001];
qq aux[100001];
int st[100001];
int finl[100001];
bool placed[100001];
bool used[100001];
int lazy[400001];

bool cmp (qq a, qq b)
{
    if (a.x!=b.x)
        return a.x<b.x;
    else if (a.l!=b.l)
        return a.l<b.l;
    else
        return a.r<b.r;
}

bool cmp2(ptval a, ptval b)
{
    return a.nr>b.nr;
}

bool cmp3 (qq a, qq b)
{
    if (a.x!=b.x)
        return a.x<b.x;
    else if (a.l!=b.l)
        return a.l<b.l;
    else
        return a.r<b.r;
}

void propagate(int parent, int child)
{
    lazy[child]=lazy[parent];
}

void lazy_update (int l, int r, int val, int qa, int qb, int x)
{
    if (lazy[val]!=-1)
    {
        if (r!=l)
        {
            propagate(val,val*2);
            propagate(val,val*2+1);
        }
        lazy[val]=-1;
    }
    if (l>qb || r<qa)
        return;
    if (qa<=l && r<=qb)
    {
        lazy[val]=x;
        return;
    }
    int mid;
    mid=(l+r)/2;
    if (qa<=mid)
        lazy_update(l,mid,val*2,qa,qb,x);
    if (qb>mid)
        lazy_update(mid+1,r,val*2+1,qa,qb,x);
}

int qry (int l, int r, int val, int qa, int qb)
{
    if (qa<=l && r<=qb)
    {
        return lazy[val];
    }
    if (lazy[val]!=-1)
    {
        if (r!=l)
        {
            propagate(val,val*2);
            propagate(val,val*2+1);
        }
        lazy[val]=-1;
    }
    if (r<qa || l>qb)
        return inf;
    int mid,ans;
    mid=(l+r)/2;
    ans=inf;
    if (qa<=mid)
        ans=min(ans,qry(l,mid,val*2,qa,qb));
    if (qb>mid)
        ans=min(ans,qry(mid+1,r,val*2+1,qa,qb));
    return ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int n,q,i,j,t,q2,big,dif;
    bool ok;
    ok=true;
    cin >> n >> q;
    for (i=1; i<=q; i++)
    {
        cin >> query[i].l >> query[i].r >> query[i].x;
        query2[i]=query[i];
    }
    sort(query+1,query+1+q,cmp);
    sort(query2+1,query2+1+q,cmp);
    t=0;
    for (j=1; j<=q; j++)
    {
        if (t==0 || query[j].x!=query[st[t]].x || (query[j].r<query[st[t]].l || query[j].l>query[st[t]].r))
        {
            t++;
            st[t]=j;
        }
        else
        {
            query[st[t]].l=max(query[st[t]].l,query[j].l);
            query[st[t]].r=min(query[st[t]].r,query[j].r);
        }
    }
    q2=q;
    q=t;
    while (t>0)
    {
        aux[t]=query[st[t]];
        t--;
    }
    for (j=1; j<=q; j++)
    {
        query[j]=aux[j];
        if (query[j].l==query[j-1].l && query[j].r==query[j-1].r && query[j].x!=query[j-1].x)
            ok=false;
    }
    t=0;
    for (j=1; j<=q2; j++)
    {
        ///cout << query2[j].l << " " << query2[j].r << " " << query2[j].x << "\n";
        if (t==0 || query2[j].x!=query2[st[t]].x || (query2[j].r<query2[st[t]].l || query2[j].l>query2[st[t]].r))
        {
            t++;
            st[t]=j;
        }
        else
        {
            query2[st[t]].l=min(query2[st[t]].l,query2[j].l);
            query2[st[t]].r=max(query2[st[t]].r,query2[j].r);
        }
    }
    q2=t;
    while (t>0)
    {
        aux[t]=query2[st[t]];
        t--;
    }
    for (j=1; j<=q2; j++)
    {
        query2[j]=aux[j];
        if (query2[j].l==query2[j-1].l && query2[j].r==query2[j-1].r && query2[j].x!=query2[j-1].x)
            ok=false;
    }
    for (j=0; j<=4*n; j++)
    {
        lazy[j]=-1;
    }
    for (j=1; j<=q; j++)
    {
        lazy_update(1,n,1,query[j].l+1,query[j].r+1,query[j].x);
    }
    for (j=1; j<=n; j++)
    {
        val[j].nr=qry(1,n,1,j,j);
        val[j].poz=j;
    }
    sort(val+1,val+1+n,cmp2);
    dif=0;
    for (j=1; j<=n; j++)
    {
        if (val[j].nr!=-1 && !placed[val[j].nr] && !used[val[j].poz])
        {
            dif++;
            placed[val[j].nr]=1;
            used[val[j].poz]=1;
            finl[val[j].poz]=val[j].nr;
        }
    }
    if (dif!=q)
        ok=false;
    for (j=0; j<=4*n; j++)
    {
        lazy[j]=-1;
    }
    for (j=1; j<=q2; j++)
    {
        lazy_update(1,n,1,query2[j].l+1,query2[j].r+1,query2[j].x);
    }
    for (j=1; j<=n; j++)
    {
        val[j].nr=qry(1,n,1,j,j);
        val[j].poz=j;
    }
    sort(val+1,val+1+n,cmp2);
    big=n-1;
    for (j=1; j<=n; j++)
    {
        if (!used[val[j].poz])
        {
            while (big>=0 && placed[big])
            {
                big--;
            }
            if (big<val[j].nr)
            {
                ok=false;
                break;
            }
            placed[big]=1;
            used[val[j].poz]=1;
            finl[val[j].poz]=big;
        }
    }
    if (ok==false)
    {
        for (j=1; j<=n; j++)
        {
            cout << -1 << " ";
        }
    }
    else
    {
        for (j=1; j<=n; j++)
        {
            cout << finl[j] << " ";
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6488 KB Output is correct
9 Correct 1 ms 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6488 KB Output is correct
9 Correct 1 ms 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Incorrect 2 ms 6492 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6488 KB Output is correct
9 Correct 1 ms 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Incorrect 2 ms 6492 KB Output isn't correct
13 Halted 0 ms 0 KB -