제출 #1077266

#제출 시각아이디문제언어결과실행 시간메모리
1077266LIFEvent Hopping (BOI22_events)C++14
25 / 100
1590 ms9040 KiB
#include<bits/stdc++.h>
using namespace std;
int n,q,l[500005],r[500005];
int su[800005];
int dis[5005][5005];
int go[500005];
struct nod
{
    int ll;
    int rr;
    int id;
}node[500005];
bool cmp(nod x,nod y)
{
   if(x.rr == y.rr)return x.ll < y.ll;
   else return x.rr < y.rr;
}
int read()
{
    int x=0,f=1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = (x<<3) + (x<<1) + (ch-'0');
        ch = getchar();
    }
    return x*f;

}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        l[i] = read();r[i] = read();
        nod temp = nod{l[i],r[i],i};
        node[i] = temp;
    }
    sort(node+1,node+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        int maxn = 1e9+100;
        go[i] = -1;
        for(int j=i-1;j>=1;j--)
        {
            if(node[j].rr >= node[i].ll && node[j].rr <= node[i].rr)
            {
                if(node[j].ll < maxn)
                {
                    maxn = node[j].ll;
                    go[i] = j;
                }
            }
        }
    }
    // for(int i=1;i<=n;i++)
    // {
    //     cout<<node[i].ll<<" "<<node[i].rr<<endl;
    // }
    // cout<<endl;
    // for(int i=1;i<=n;i++)
    // {
    //     cout<<go[i]<<" ";
    // }
    // cout<<endl;
    while(q--)
    {
        int s,e;
        cin>>s>>e;
        if(e == s)
        {
            cout<<"0"<<endl;
            continue;
        }
        if(l[e] <= r[s] && r[s] <= r[e])
        {
            cout<<"1"<<endl;
            continue;
        }
        int cnt = 0;
        int now = -1;
        for(int i=1;i<=n;i++)
        {
            if(node[i].id == e)
            {
                now = i;
                break;
            }
        }
        bool can = false;
        while(now != -1)
        {
            int ll = node[now].ll;
            int rr = node[now].rr;
            if(ll <= r[s] && r[s] <= rr)
            {
                cnt++;
                can = true;
                break;
            }
            now = go[now];
            cnt++;
        }
        if(can == true)cout<<cnt<<endl;
        else cout<<"impossible"<<endl;
    }

    return 0;
}
#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...