제출 #232696

#제출 시각아이디문제언어결과실행 시간메모리
232696thebesPort Facility (JOI17_port_facility)C++14
0 / 100
42 ms70784 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define F first
#define S second
#define pb push_back

const int MN = 1e6+5, mod = 1e9+7;
int N, i, j, x, y, vs[MN], col[MN], ord[MN], ans, cur, on[MN]; vector<pii> st[3*MN];
pii arr[MN], evt[2*MN]; queue<int> go; stack<int> stk[2];

void build(int i,int s,int e){
    if(s!=e){
        build(2*i,s,(s+e)/2);
        build(2*i+1,(s+e)/2+1,e);
    }
    st[i].clear();
}

void upd(int i,int s,int e,int idx,int id){
    st[i].pb({arr[id].S,id});
    if(s==e) return;
    if((s+e)/2<idx) upd(2*i+1,(s+e)/2+1,e,idx,id);
    else upd(2*i,s,(s+e)/2,idx,id);
}

void qu(int i,int s,int e,int ss,int se,int y){
    if(s>=ss&&e<=se){
        while(st[i].size()&&st[i].back().F>=y){
            if(!vs[st[i].back().S]){
                vs[st[i].back().S]=1;
                col[st[i].back().S]=!col[cur];
                go.push(st[i].back().S);
            }
            st[i].pop_back();
        }
    }
    else if((s+e)/2<ss) qu(2*i+1,(s+e)/2+1,e,ss,se,y);
    else if((s+e)/2>=se) qu(2*i,s,(s+e)/2,ss,se,y);
    else qu(2*i,s,(s+e)/2,ss,se,y), qu(2*i+1,(s+e)/2+1,e,ss,se,y);
}

int main(){
    scanf("%d",&N);
    for(i=1;i<=N;i++){
        scanf("%d%d",&arr[i].F,&arr[i].S);
        ord[i] = i;
    }
    sort(arr+1,arr+N+1,[](pii i,pii j){return i.F<j.F;});
    sort(ord+1,ord+N+1,[](int i,int j){return arr[i].S<arr[j].S;});
    for(i=1;i<=N;i++){
        evt[2*i-1] = {arr[i].F, i};
        evt[2*i] = {arr[i].S, i};
    }
    for(i=1;i<=N;i++)
        upd(1,1,2*N,arr[ord[i]].F,ord[i]);
    ans = 1;
    for(i=1;i<=N;i++){
        if(!vs[i]){
            ans = 2LL*ans%mod;
            vs[i] = 1; cur = i;
            qu(1,1,2*N,arr[i].F,arr[i].S,arr[i].S);
            while(go.size()){
                cur=go.front(); go.pop();
                qu(1,1,2*N,arr[cur].F,arr[cur].S,arr[cur].S);
            }
        }
    }
    sort(evt+1,evt+2*N+1,[](pii i,pii j){return i.F<j.F;});
    for(i=1;i<=2*N;i++){
        cur = evt[i].S;
        if(on[cur]){
            if(stk[col[cur]].top()!=cur){
                ans = 0;
                break;
            }
            stk[col[cur]].pop();
        }
        else stk[col[cur]].push(cur);
        on[cur]=!on[cur];
    }
    printf("%d\n",ans);
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

port_facility.cpp: In function 'int main()':
port_facility.cpp:47:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&N);
     ~~~~~^~~~~~~~~
port_facility.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&arr[i].F,&arr[i].S);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...