| 比赛 |
省选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;
}