比赛 省选2023Day1复现 评测结果 AAAWWAAAAA
题目名称 火车站 最终得分 80
用户昵称 flyfree 运行时间 0.686 s
代码语言 C++ 内存使用 20.01 MiB
提交时间 2025-12-12 08:57:43
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
// #define LOCAL
#define ll long long
#define db double
#define Ciallo true
#define pir pair <ll,ll>
#define fs first
#define sc second
#define MAXN 200010
inline ll read(){
    ll f = 1, num = 0;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c=='-') f = -1;c = getchar();
    }
    while(c>='0'&&c<='9') num = num * 10 + c - '0', c = getchar();
    return num * f;
}

int n,m,x;
bool ins[MAXN];
int sl[MAXN][22], sr[MAXN][22];
int L,R;

int queryl(int ql, int qr){
    int k = __lg(qr - ql + 1);
    return min(sl[ql][k], sl[qr - (1 << k) + 1][k]);
}
int queryr(int ql, int qr){
    int k = __lg(qr - ql + 1);
    return max(sr[ql][k], sr[qr - (1 << k) + 1][k]);
}

int main(int argc, char* argv[]){
    freopen("station.in", "r", stdin);
    freopen("station.out", "w", stdout);
    #ifdef FS
        freopen(argv[1], "r", stdin);
        freopen(argv[2], "w", stdout);
    #elif defined(LOCAL)
        freopen("w.in", "r", stdin);
        freopen("w.out", "w", stdout);
    #endif

    n = read(),m = read(),x = read();
    L = R = x;
    
    for(int i = 1;i <= n; ++i){
        sl[i][0] = sr[i][0] = i;
    }

    for(int i = 1;i <= m; ++i){
        int l = read(),r = read();
        if(l <= x && r >= x)L = min(l, L),R = max(R, r), ins[l] = ins[r] = Ciallo;
        else if(r < x)sl[r][0] = min(sl[r][0], l), ins[l] = Ciallo; 
        else if(l > x)sr[l][0] = max(sr[l][0], r), ins[r] = Ciallo;
    }

    for(int i = 1;i <= __lg(n); ++i){
        for(int l = 1;l + (1 << i) - 1 <= n; ++l){
            sl[l][i] = min(sl[l][i - 1], sr[l + (1 << i - 1)][i - 1]);
            sr[l][i] = max(sr[l][i - 1], sr[l + (1 << i - 1)][i - 1]);
        }
    }

    {// 扩展 L
        int lst = x;
        while(L != lst){
            int ret = queryl(L, lst - 1);
            lst = L, L = ret;
        }
    }

    {// 扩展 R
        int lst = x;
        while(R != lst){
            int ret = queryr(lst + 1, R);
            lst = R, R = ret;
        }
    }

    for(int i = L;i <= R; ++i){
        if(ins[i] && i != x)cout << i << " ";
    }

    cerr << "Time : " << 1.0 * clock() / CLOCKS_PER_SEC << "s \n";
    return 0;
}