제출 #1160760

#제출 시각아이디문제언어결과실행 시간메모리
116076012345678Curtains (NOI23_curtains)C++20
100 / 100
710 ms244556 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=5e5+5, kx=20;

int n, m, q, dp[nx], l, r, st[nx], ed[nx], res[nx], layer[nx], val[nx][kx], pv[nx][kx], idx, sz, single[nx];
vector<int> sl[nx], sr[nx], upperr[nx], lowerl[nx], v;

void precompute(int l, int r, int lvl)
{
    if (l==r) return;
    int md=(l+r)/2;
    layer[md]=lvl;
    precompute(l, md, lvl+1), precompute(md+1, r, lvl+1);
    for (int i=md+1; i<=r; i++) upperr[i].push_back(md+1);
    for (int i=md; i>=l; i--) lowerl[i].push_back(md);
}

void solve(int l, int r, vector<int> &cur)
{
    if (cur.empty()) return;
    if (l==r)
    {
        for (auto idx:cur) res[idx]=single[l];
        return;
    }
    int md=(l+r)/2;
    vector<int> qrs, ql, qr;
    for (auto idx:cur)
    {
        if (ed[idx]<=md) ql.push_back(idx);
        else if (st[idx]>=md+1) qr.push_back(idx);
        else qrs.push_back(idx);
    }
    solve(l, md, ql);
    solve(md+1, r, qr);
    stack<int> s;
    //cout<<"debug "<<l<<' '<<md<<' '<<r<<'\n';
    for (int i=md+1; i<=r; i++)
    {
        //cout<<"upperbound "<<md+1<<'('<<i<<')'<<" : "<<val[i][layer[md]]<<' '<<pv[i][layer[md]]<<'\n';
        dp[i]=0;
        if (pv[i][layer[md]]!=-1) dp[i]=pv[i][layer[md]];
        if (val[i][layer[md]]!=-1) while (!s.empty()&&s.top()>=val[i][layer[md]]-1) dp[i]=max(dp[i], dp[s.top()]), s.pop();
        s.push(i);
        //cout<<"dp "<<dp[i]<<'\n';
    }
    while (!s.empty()) s.pop();
    for (int i=md; i>=l; i--)
    {
        //cout<<"lowerbound "<<md+1<<'('<<i<<')'<<" : "<<val[i][layer[md]]<<' '<<pv[i][layer[md]]<<'\n';
        dp[i]=n+1;
        if (val[i][layer[md]]!=-1) dp[i]=val[i][layer[md]]; 
        if (pv[i][layer[md]]!=-1) while (!s.empty()&&s.top()<=pv[i][layer[md]]+1) dp[i]=min(dp[i], dp[s.top()]), s.pop();
        s.push(i);
        //cout<<"dp "<<dp[i]<<'\n';
    }
    for (auto idx:qrs) res[idx]=(dp[st[idx]]<=ed[idx]&&st[idx]<=dp[ed[idx]]);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m>>q;
    for (int i=1; i<=m; i++) cin>>l>>r, sr[r].push_back(l), sl[l].push_back(r), single[l]=(single[l]|(l==r));
    for (int i=1; i<=q; i++) cin>>st[i]>>ed[i], v.push_back(i);
    precompute(1, n, 0);
    /*
    cout<<"layer ";
    for (int i=1; i<=n; i++) cout<<layer[i]<<' ';
    cout<<'\n';
    */
    for (int i=1; i<=n; i++)
    {
        reverse(upperr[i].begin(), upperr[i].end());
        sort(sr[i].begin(), sr[i].end());
        sort(sl[i].begin(), sl[i].end());
        idx=0, sz=sr[i].size();
        for (auto x:upperr[i])
        {
            while (idx<sz&&x>=sr[i][idx]) idx++;
            if (idx<sz) val[i][layer[x-1]]=sr[i][idx];
            else val[i][layer[x-1]]=-1;
            if (idx>0) pv[i][layer[x-1]]=sr[i][idx-1];
            else pv[i][layer[x-1]]=-1;
        }
        idx=0, sz=sl[i].size();
        for (auto x:lowerl[i])
        {
            while (idx<sz&&x>sl[i][idx]) idx++;
            if (idx<sz) val[i][layer[x]]=sl[i][idx];
            else val[i][layer[x]]=-1;
            if (idx>0) pv[i][layer[x]]=sl[i][idx-1];
            else pv[i][layer[x]]=-1;
        }
        /*
        cout<<"upperr "<<i<<':';
        for (auto x:upperr[i]) cout<<x<<' ';
        cout<<'\n';
        cout<<"lowerl "<<i<<':';
        for (auto x:lowerl[i]) cout<<x<<' ';
        cout<<'\n';
        */
    }
    solve(1, n, v);
    for (int i=1; i<=q; i++) cout<<(res[i]?"YES\n":"NO\n");
}

/*
10 2 1
4 6
7 8
4 8
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...