看到好多巨佬都用了很复杂的方法来做,当初孩子出考场就吓坏了,以为咱考虑少了,但是民间数据测了确实可以过.这个思路是否过于简单(感觉很直觉但是好像又有Hack但是又反驳了自己的Hack),于是来求各位帮忙看一下
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 1018 + 1108;
struct Railway{
int l,r;
}lw[MAXN],rw[MAXN];//leftway rightway
bool CmpL(Railway a,Railway b){
return a.l < b.l;
}
bool CmpR(Railway a,Railway b){
return a.r < b.r;
}
int n,m,x;
bool vis[MAXN];
inline void SolveL(){//to left
int possL = x,pos;//possible left position
for(pos = m;pos >= 1;pos--){//use CmpR
if(rw[pos].r < possL)break;
if(rw[pos].l < x)vis[rw[pos].l] = 1;
possL = min(possL,rw[pos].l);
}
return ;
}
inline void SolveR(){
int possR = x,pos;//possible right position
for(pos = 1;pos <= m;pos++){//use CmpL
if(lw[pos].l > possR)break;
if(lw[pos].r > x)vis[lw[pos].r] = 1;
possR = max(possR,lw[pos].r);
}
return ;
}
int main(){
freopen("station.in","r",stdin);
freopen("station.out","w",stdout);
scanf("%d%d%d",&n,&m,&x);
for(int i = 1;i <= m;i++){
scanf("%d%d",&lw[i].l,&lw[i].r);
rw[i] = lw[i];
}
sort(lw+1,lw+m+1,CmpL);
sort(rw+1,rw+m+1,CmpR);
SolveL();
SolveR();
for(int i = 1;i <= n;i++){
if(vis[i] && x != i)printf("%d ",i);
}
return 0;
}
//9:04 az,神选T1这么简单啊 感谢**F给蒟蒻送的100pts
//但是 为什么 为什么你要考tarjan
//你让我疯狂!!! (发电ing