답안 #993151

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
993151 2024-06-05T11:04:59 Z MarwenElarbi Event Hopping (BOI22_events) C++17
20 / 100
380 ms 33724 KB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
const int nax=3e5+5;
vector<pair<int,int>> segtree(4*nax);
struct query{
    int x,type,idx,value;
};
bool compare(query a,query b){
    if(a.x!=b.x) return a.x<b.x;
    else if(a.type!=b.type) return a.type<b.type;
    else return a.idx<b.idx;
}
vector<query> sweep;
void build(int pos,int l,int r){
    if(l==r){
        segtree[pos]={sweep[l].value,sweep[l].idx};
        return;
    }
    int mid=(r+l)/2;
    build(pos*2+1,l,mid);
    build(pos*2+2,mid+1,r);
    segtree[pos]=max(segtree[pos*2+1],segtree[pos*2+2]);
    return;
}
pair<int,int> query(int pos,int l,int r,int left,int right){
    if(l>r||l>right||r<left) return {-1,-1};
    else if(l>=left&&r<=right) return segtree[pos];
    int mid=(r+l)/2;
    return max(query(pos*2+1,l,mid,left,right),query(pos*2+2,mid+1,r,left,right));
}
int main(){
    int n,q;
    cin>>n>>q;
    vector<pair<int,int>> tab(n);
    for (int i = 0; i < n; ++i)
    {
        cin>>tab[i].fi>>tab[i].se;
        sweep.pb({tab[i].fi,0,i,tab[i].se});
        sweep.pb({tab[i].se,1,i,tab[i].se});
    }
    sort(sweep.begin(),sweep.end(),compare);
    pair<int,int> pos[n];
    for (int i = 0; i < sweep.size(); ++i)
    {
        if(sweep[i].type==0){
            pos[sweep[i].idx].fi=i;
        }else{
            pos[sweep[i].idx].se=i;
        }
    }
    build(0,0,sweep.size()-1);
    int dp[n][20];
    int dp1[n][20];
    for (int i = 0; i < sweep.size(); ++i)
    {
        if(sweep[i].type==1){
            dp[sweep[i].idx][0]=query(0,0,sweep.size()-1,0,pos[sweep[i].idx].se).se;
            dp1[sweep[i].idx][0]=query(0,0,sweep.size()-1,pos[sweep[i].idx].fi,pos[sweep[i].idx].se).se;
        }
    }
    for (int j = 1; j < 20; ++j)
    {
        for (int i = 0; i < n; ++i)
        {
            dp[i][j]=dp[dp[i][j-1]][j-1];
            dp1[i][j]=dp1[dp[i][j-1]][j-1];
        }
    }
    while(q--){
        int s,e;
        cin>>s>>e;
        s--;
        e--;
        int ans=0;
        if(s==e){
            cout <<0<<endl;
            continue;
        }else if(tab[s].fi==tab[e].fi&&tab[s].se==tab[e].se){
            cout <<1<<endl;
            continue;
        }else if(tab[e].se<=tab[s].fi&&tab[e].fi<tab[s].fi){
            cout <<"impossible"<<endl;
            continue;
        }else if(tab[e].fi<=tab[s].fi&&tab[s].fi<=tab[e].se&&tab[e].se<=tab[s].se){
            cout <<"impossible"<<endl;
            continue;
        }else if(tab[s].se>=tab[e].fi&&tab[s].fi<=tab[e].fi){
            cout <<1<<endl;
            continue;
        }
        for (int i = 19; i >= 0; --i)
        {
            if(tab[dp[s][i]].se<tab[e].fi){
                ans+=(1<<i);
                s=dp[s][i];
            }
        }
        //cout <<"nab "<<s<<" "<<ans<<endl;
        for (int i = 19; i >= 0; --i)
        {
            if(tab[dp1[s][i]].se<tab[e].fi){
                ans+=(1<<i);
                s=dp[s][i];
            }
        }
        if(tab[dp1[s][0]].se<tab[e].fi) cout <<"impossible"<<endl;
        else if(tab[dp1[s][0]].se>tab[e].se) cout <<"impossible"<<endl;
        else if(tab[s].se<tab[e].fi) cout <<ans+2<<endl;
        else cout <<ans+1<<endl;
    }
}

Compilation message

events.cpp: In function 'int main()':
events.cpp:47:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |     for (int i = 0; i < sweep.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~
events.cpp:58:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |     for (int i = 0; i < sweep.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 9820 KB Output is correct
2 Correct 299 ms 32924 KB Output is correct
3 Correct 302 ms 32952 KB Output is correct
4 Correct 380 ms 33460 KB Output is correct
5 Correct 321 ms 33724 KB Output is correct
6 Correct 332 ms 33220 KB Output is correct
7 Correct 325 ms 32780 KB Output is correct
8 Correct 264 ms 33560 KB Output is correct
9 Correct 320 ms 33468 KB Output is correct
10 Correct 332 ms 32884 KB Output is correct
11 Incorrect 312 ms 33096 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 9820 KB Output is correct
2 Correct 3 ms 9820 KB Output is correct
3 Correct 4 ms 9888 KB Output is correct
4 Correct 3 ms 10076 KB Output is correct
5 Incorrect 3 ms 10092 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 9820 KB Output is correct
2 Correct 3 ms 9820 KB Output is correct
3 Correct 4 ms 9888 KB Output is correct
4 Correct 3 ms 10076 KB Output is correct
5 Incorrect 3 ms 10092 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 9820 KB Output is correct
2 Correct 3 ms 9820 KB Output is correct
3 Correct 4 ms 9888 KB Output is correct
4 Correct 3 ms 10076 KB Output is correct
5 Incorrect 3 ms 10092 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 291 ms 32928 KB Output is correct
2 Correct 308 ms 33488 KB Output is correct
3 Correct 370 ms 32952 KB Output is correct
4 Correct 273 ms 33464 KB Output is correct
5 Correct 301 ms 33688 KB Output is correct
6 Correct 293 ms 32952 KB Output is correct
7 Correct 299 ms 32972 KB Output is correct
8 Correct 316 ms 33468 KB Output is correct
9 Correct 141 ms 32008 KB Output is correct
10 Correct 305 ms 33320 KB Output is correct
11 Correct 322 ms 32412 KB Output is correct
12 Correct 314 ms 32736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 9820 KB Output is correct
2 Correct 299 ms 32924 KB Output is correct
3 Correct 302 ms 32952 KB Output is correct
4 Correct 380 ms 33460 KB Output is correct
5 Correct 321 ms 33724 KB Output is correct
6 Correct 332 ms 33220 KB Output is correct
7 Correct 325 ms 32780 KB Output is correct
8 Correct 264 ms 33560 KB Output is correct
9 Correct 320 ms 33468 KB Output is correct
10 Correct 332 ms 32884 KB Output is correct
11 Incorrect 312 ms 33096 KB Output isn't correct
12 Halted 0 ms 0 KB -