int_Hello_world @ 2023-04-08 17:38:58
萌新刚学线段树优化建图,样例都没过。 代码如下:
#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;
}