T第八个点
  • 板块CF786B Legacy
  • 楼主imfkwk
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/23 18:35
  • 上次更新2023/11/4 13:32:26
查看原帖
T第八个点
389540
imfkwk楼主2021/7/23 18:35
#include<bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;

inline void read(int&x)
{
	x=0;bool f=1;
	char ch=getchar();
	while(ch<48||ch>57){f=!(ch==45);ch=getchar();}
	while(ch>=48&&ch<=57){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x=f?x:-x;
}

int n,m,s;

int hd[4*N],to[22*N],fm[22*N],vl[22*N],cnt;
inline void add(int x,int y,int w)
{
	++cnt;
	fm[cnt]=hd[x];
	to[cnt]=y;
	vl[cnt]=w;
	hd[x]=cnt;
}

struct node
{
	int l,r;
	int ls,rs;
};
int num;

int rtin;
node ind[N<<1];
int rtot;
node otd[N<<1];

int build1(int L,int R)
{
	if(L==R)
	{
		ind[L].l=L;
		ind[L].r=R;
		return L;
	}
	
	int u=++num;
	int mid=(L+R)>>1;
	ind[u].l=L;
	ind[u].r=R;
	ind[u].ls=build1(L,mid);
	ind[u].rs=build1(mid+1,R);
	add(u,ind[u].ls,0);
	add(u,ind[u].rs,0);
	return u;
}

int build2(int L,int R)
{
	if(L==R)
	{
		otd[L].l=L;
		otd[L].r=R;
		return L;
	}
	
	int u=++num;
	int mid=(L+R)>>1;
	otd[u].l=L;
	otd[u].r=R;
	otd[u].ls=build2(L,mid);
	otd[u].rs=build2(mid+1,R);
	add(otd[u].ls,u,0);
	add(otd[u].rs,u,0);
	return u;
}

void connect2(int x,int w,int L,int R,int u)
{
	if(L<=ind[u].l&&ind[u].r<=R)
	{
		add(x,u,w);
		return;
	}
	
	int mid=(ind[u].l+ind[u].r)>>1;
	
	if(L<=mid)connect2(x,w,L,R,ind[u].ls);
	if(R>mid)connect2(x,w,L,R,ind[u].rs);
}

void connect3(int x,int w,int L,int R,int u)
{
	if(L<=otd[u].l&&otd[u].r<=R)
	{
		add(u,x,w);
		return;
	}
	
	int mid=(otd[u].l+otd[u].r)>>1;
	
	if(L<=mid)connect3(x,w,L,R,otd[u].ls);
	if(R>mid)connect3(x,w,L,R,otd[u].rs);
}

int d[N<<2];
bool in[N<<2];
struct nnd
{
	int num;
	bool operator<(const nnd x)const
	{
		return d[num]>d[x.num];
	}
};
priority_queue<nnd>q;

inline void jk()
{
	memset(d,0x3f,sizeof(d));
	d[s]=0;
	q.push((nnd){s});
	
	while(!q.empty())
	{
		int u=q.top().num;
		q.pop();
		if(in[u])continue;
		
		for(register int e=hd[u];e;e=fm[e])
		{
			int v=to[e];
			int w=vl[e];
			if(d[v]>d[u]+w)
			{
				d[v]=d[u]+w;
				q.push((nnd){v});
			}
		}
	}
}

signed main(void)
{
	read(n);read(m);read(s);
	
	num=n;
	rtin=build1(1,n);
	rtot=build2(1,n);
	
	while(m--)
	{
		int op;read(op);
		switch(op)
		{
			case 1:
			{
				int v,u,w;
				read(v);read(u);read(w);
				add(v,u,w);
				break;
			}
			case 2:
			{
				int v,l,r,w;
				read(v);read(l);read(r);read(w);
				connect2(v,w,l,r,rtin);
				break;
			}
			case 3:
			{
				int v,l,r,w;
				read(v);read(l);read(r);read(w);
				connect3(v,w,l,r,rtot);
				break;
			}
		}
	}
	
	jk();
	
	for(register int i=1;i<=n;++i)
	{
		if(d[i]==4557430888798830399)printf("%lld ",-1ll);
		else printf("%lld ",d[i]);
	}
	
	return 0;
}
2021/7/23 18:35
加载中...