比赛 |
2025.2.24 |
评测结果 |
AAAAAAATAA |
题目名称 |
火车站 |
最终得分 |
90 |
用户昵称 |
flyfreem |
运行时间 |
3.006 s |
代码语言 |
C++ |
内存使用 |
120.13 MiB |
提交时间 |
2025-02-24 11:02:41 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 400010
//#define id(x,y) x*m*4+y
#define debug cout<<"flyfreemrn\n";
// By flyfreemrn
inline ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x>9)write(x/10);
putchar(x%10+'0');
}
ll hd[MAXN*20],ed[MAXN*50],nxt[MAXN*50];
ll idx,n,m,st;
ll vis[MAXN*20],ins[MAXN];
void build(ll x,ll y){
// cout<<"build: "<<x<<" "<<y<<endl;
nxt[++idx]=hd[x];
ed[idx]=y;
hd[x]=idx;
}
ll id(ll x,ll y){
return x*4*m+y;
}
//线段树建边
struct node_sgt{
ll l[MAXN*4],r[MAXN*4];
ll type;
void sgtbuild(ll lz,ll rz,ll now){
// cout<<type<<" "<<now<<" "<<lz<<" "<<rz<<endl;
l[now]=lz,r[now]=rz;
if(lz==rz){
build(id(type<<1,now),id(type<<1|1,now));
return;
}
ll mid=(lz+rz)>>1;
// debug;
// ll now_id=id(type<<1,now);
// cout<<now_id<<endl;
// cout<<type<<" "<<id(type<<1,now)<<" "<<now_id<<endl;
build(id(type<<1,now),id(type<<1,now<<1));
build(id(type<<1,now),id(type<<1,now<<1|1));
// debug;
build(id(type<<1|1,now<<1),id(type<<1|1,now));
build(id(type<<1|1,now<<1|1),id(type<<1|1,now));
// debug;
sgtbuild(lz,mid,now<<1);
sgtbuild(mid+1,rz,now<<1|1);
}
void cnn(ll lz,ll rz,ll now,ll to_id){
if(l[now]>=lz&&r[now]<=rz){
build(id(type<<1|1,now),to_id);
build(to_id,id(type<<1,now));
return;
}
ll mid=(l[now]+r[now])>>1;
if(lz<=mid)cnn(lz,rz,now<<1,to_id);
if(rz>mid)cnn(lz,rz,now<<1|1,to_id);
}
// void insert(ll pos,ll now,ll to_id){
// if(l[now]==r[now]){
// p[now]=to_id;
// return;
// }
// ll mid=(l[now]+r[now])>>1;
// if(pos<=mid)cnn(pos,now<<1,to_id);
// else cnn(pos,now<<1|1,to_id);
// }
}sgt[2];
//存边
struct node_line{
ll l,r,w;
}line1[MAXN],line2[MAXN],line[MAXN];
ll id1[MAXN],id2[MAXN];
bool cmpl(node_line a,node_line b){
return a.l<b.l;
}
bool cmpr(node_line a,node_line b){
return a.r<b.r;
}
ll getl(ll lz,ll rz,ll pos){
while(rz>lz){
ll mid=(lz+rz+1)>>1;
if(line1[mid].l<=pos)lz=mid;
else rz=mid-1;
}
return lz;
}
ll getr(ll lz,ll rz,ll pos){
while(rz>lz){
ll mid=(lz+rz)>>1;
if(line2[mid].r>=pos)rz=mid;
else lz=mid+1;
}
return rz;
}
void bfs(){
queue<ll> q;
q.push(0);
vis[0]=1;
while(!q.empty()){
ll now=q.front();
// if(now>id(2,0))cout<<2<<" "<<now-id(2,0)<<endl;
// else if(now>id(1,0))cout<<1<<" "<<now-id(1,0)<<endl;
// else cout<<0<<" "<<now<<endl;
if(now>id(4,0)){
ll now_id=now-id(4,0);
if(line[now_id].l<=st)ins[line[now_id].l]=1;
if(line[now_id].r>=st)ins[line[now_id].r]=1;
}
q.pop();
for(int i=hd[now];i;i=nxt[i]){
ll y=ed[i];
if(!vis[y]){
vis[y]=1;
q.push(y);
}
}
}
}
int main(){
freopen("station.in","r",stdin);
freopen("station.out","w",stdout);
n=read(),m=read(),st=read();
for(int i=1;i<=m;i++){
line[i].l=line1[i].l=line2[i].l=read();
line[i].r=line1[i].r=line2[i].r=read();
line1[i].w=line2[i].w=i;
if(line1[i].l<=st&&line1[i].r>=st){
build(0,id(4,i));
build(id(4,i),0);
}
}
// debug;
sgt[0].type=0,sgt[1].type=1;
sgt[0].sgtbuild(1,m,1);
sgt[1].sgtbuild(1,m,1);
sort(line1+1,line1+1+m,cmpl);
sort(line2+1,line2+1+m,cmpr);
// debug;
for(int i=1;i<=m;i++)id1[line1[i].w]=id2[line2[i].w]=i;
for(int i=1;i<=m;i++){
ll lim=getl(id1[i],m,line1[id1[i]].r);
sgt[0].cnn(id1[i],lim,1,id(4,i));
lim=getr(1,id2[i],line2[id2[i]].l);
sgt[1].cnn(lim,id2[i],1,id(4,i));
}
// debug;
bfs();
// debug;
for(int i=1;i<=n;i++){
if(ins[i]&&i!=st)cout<<i<<" ";
}
return 0;
}