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