20pts STL求调 AC#1 #10
查看原帖
20pts STL求调 AC#1 #10
557892
n___j__z____楼主2024/7/24 17:48
#include <bits/stdc++.h>
#define ll long long
#define db double
#define int long long
#define ls rt<<1
#define rs rt<<1|1
#define lb(x) x&-x
using namespace std;
const int N=100002,inf=1e9;
int n,D,dis[N<<1],h,t;
struct node{
	int a,b,id,ok;
	bool operator <(const node &g)const{
		if(ok!=g.ok) return ok<g.ok;
		return ok?a<g.a:b<g.b;
	}
}p[N<<1],q[N<<1];
set<node>s;
set<node>::iterator it,ii; 
void bfs(){
	node u;
	while(h<t){
		u=q[h++];
		if(!u.ok){
			it=s.lower_bound(node{u.a-D,0,0,1});
			while(it!=s.end()&&(*it).a<=u.a){
				ii=it++;
				q[t++]=(*ii),dis[(*ii).id]=dis[u.id]+1;
				s.erase(ii);	
			}
		}else{
			it=s.upper_bound(node{0,u.b-D,0,0});
			while(it!=s.end()&&!(*it).ok&&(*it).b<=u.b){
				ii=it++;
				q[t++]=(*ii),dis[(*ii).id]=dis[u.id]+1;
				s.erase(ii);	
			}
		}
//		cout<<"\n";
	}
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>D;
	for(int i=1;i<=n+n;i++) cin>>p[i].a>>p[i].b,p[i].id=i;
	for(int i=n+1;i<=n+n;i++) p[i].ok=1;
	for(int i=1;i<=n;i++){
		if(p[i].b==0) q[t++]=p[i],dis[p[i].id]=1;
		else s.insert(p[i]);
	}for(int i=n+1;i<=n+n;i++){
		if(p[i].a==0) q[t++]=p[i],dis[p[i].id]=1;
		else s.insert(p[i]);
	}bfs();
	for(int i=1;i<=n;i++){
		if(!dis[i]) cout<<"-1\n";
		else cout<<dis[i]<<"\n";
	}
	return 0;
}
2024/7/24 17:48
加载中...