萌新求助线段树优化建图版子
查看原帖
萌新求助线段树优化建图版子
696967
int_Hello_world楼主2023/4/8 17:38

萌新刚学线段树优化建图,样例都没过。 代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {                   
	int x=0,f=0;char ch=getchar();                   
	for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');             
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);   
	return f?-x:x;        
}                      
void print(int x) {          
	if(x<0) putchar('-'),x=-x;       
	if(x>9) print(x/10);           
	putchar(x%10+48);               
}    
int x,y,z,s,n,m,cnt,head[1231311],dis[1023131],tot;
bool vis[1023131];
int in_root,out_root,in_num[1231311],out_num[1023131];
struct node{
	int next,to,w;
}e[1023131];
void add(int u,int v,int w){
	e[++cnt].next=head[u];
	e[cnt].to=v;
	e[cnt].w=w;
	head[u]=cnt;
}
namespace ss{
	#define lson tree[pos].ls
	#define rson tree[pos].rs
	struct sss{
		int sum,ls,rs;
	}tree[1201231];
	void build(int &pos,int l,int r) {
		pos=++tot;
		if (l==r) {
			in_num[l]=pos;
			return ;
		}
	    int mid=l+r>>1;
	    build(lson,l,mid); build(rson,mid+1,r);
	    add(lson,pos,0); add(rson,pos,0);
	}
	void update(int pos,int l,int r,int L,int R,int k,int val) {
		if (l>=L && r<=R) {
			add(pos,k,val);
			return ;
		}
		int mid=l+r>>1;
		if (L<=mid) update(lson,l,mid,L,R,k,val);
		if (R>mid) update(rson,mid+1,r,L,R,k,val);
	}
}
namespace ss2{
	#define lson tree[pos].ls
	#define rson tree[pos].rs
	struct sss{
		int sum,ls,rs;
	}tree[1201231];
	void build(int &pos,int l,int r) {
		pos=++tot;
		if (l==r) {
			out_num[l]=pos;
			return ;
		}
	    int mid=l+r>>1;
	    build(lson,l,mid); build(rson,mid+1,r);
	    add(pos,lson,0); add(pos,rson,0);
	}
	void update(int pos,int l,int r,int L,int R,int k,int val) {
		if (l>=L && r<=R) {
			add(k,pos,val);
			return ;
		}
		int mid=l+r>>1;
		if (L<=mid) update(lson,l,mid,L,R,k,val);
		if (R>mid) update(rson,mid+1,r,L,R,k,val);
	}	
}
void dj(){
	s=in_num[s];
	memset(dis,0x3f,sizeof(dis));
	priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;
	q.push(make_pair(0,s));
    dis[s]=0;
    while(!q.empty()) {
    	int now=q.top().second; q.pop();
        if (vis[now]) continue;
        vis[now]=1;
        for (int i=head[now];i;i=e[i].next) {
        	if (dis[e[i].to]>dis[now]+e[i].w) {
        		dis[e[i].to]=dis[now]+e[i].w;
        		q.push(make_pair(dis[e[i].to],e[i].to));
			}
		}
	}
} 
signed main(){
	n=read(); m=read(); s=read();
	ss::build(in_root,1,n);
	ss2::build(out_root,1,n);
	for (int i=1;i<=n;++i) {
		add(in_num[i],out_num[i],0); add(out_num[i],in_num[i],0);
	}	
	for (int i=1;i<=m;++i) {
        int x=read(),y=read(),l=read(),r=read(),a=++tot,b=++tot;
        add(a,b,1);
        ss::update(in_root,1,n,x,y,a,0);
        ss2::update(out_root,1,n,l,y,b,0);
        a=++tot,b=++tot;
        add(a,b,1);
        ss::update(in_root,1,n,l,r,a,0);
        ss2::update(out_root,1,n,x,y,b,0);
	}
	dj();
	for (int i=1;i<=n;++i) {
		cout<<dis[out_num[i]]<<"\n";
	}
	return 0;
}
2023/4/8 17:38
加载中...