wa71分求调
  • 板块P1186 玛丽卡
  • 楼主expnoi
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/14 07:39
  • 上次更新2023/11/3 09:59:47
查看原帖
wa71分求调
378346
expnoi楼主2023/7/14 07:39
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return s*w;
}
inline void print(int x)
{
	if(x<0)x=-x,putchar('-');
	if(x>=10)print(x/10);
	putchar(x%10+48);
}
int n,m;
struct node{
	int u,v,w,next; 
}e[1000010];
int eid=1,head[1000010],dis[2][1000010],vis[1000010],pre[1000010],appear[1000010],pre1[1000010],pren[1000010],to[1000010],Pre[1000010],visit[1000010];
inline void insert(int u,int v,int w)
{
	e[eid].u=u;
	e[eid].v=v;
	e[eid].w=w;
	e[eid].next=head[u];
	head[u]=eid++;
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
struct edge{
	int l,r,mi,lazy;
}C[4000010];
vector<int> path;
inline void build(int id,int l,int r)
{
	C[id].l=l,C[id].r=r;
	C[id].lazy=0x3f3f3f3f;
	if(l==r)
	{
		C[id].mi=0x3f3f3f3f;
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
}
inline void modify(int id,int v)
{
	//cout<<C[id].l<<" "<<C[id].r<<' '<<C[id].mi<<"\n";
	C[id].lazy=min(C[id].lazy,v);
	C[id].mi=min(C[id].mi,v); 
}
inline void pushdown(int id)
{
	//cout<<"lazy:"<<C[id].lazy<<"\n";
	modify(id<<1,C[id].lazy);
	modify(id<<1|1,C[id].lazy);
	C[id].lazy=0x3f3f3f3f;
	//cout<<"lazy2:"<<C[id].lazy<<"\n";
}
inline void update(int id,int x,int y,int v)
{
	//cout<<"si:"<<id<<' '<<x<<' '<<y<<" "<<v<<"\n";
	if(x<=C[id].l&&C[id].r<=y)
	{
		modify(id,v);
		return;
	}
	if(C[id].lazy==0)
	{
		cout<<C[id].l<<" "<<C[id].r<<" "<<C[id].lazy<<" "<<C[id].mi<<" "<<v<<"\n";
	}
	pushdown(id);
	int mid=C[id].l+C[id].r>>1;
	if(x<=mid)
	{
		update(id<<1,x,y,v);
	}
	if(y>mid)update(id<<1|1,x,y,v);
}
inline int query(int id,int x)
{
	if(C[id].l==C[id].r)
	{
		//cout<<C[id].mi<<"\n";
		return C[id].mi;
	}
	pushdown(id);
	int mid=C[id].l+C[id].r>>1;
	if(x<=mid)
	{
		return query(id<<1,x);
	}
	else return query(id<<1|1,x);
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read(),w=read();
		insert(u,v,w);
		insert(v,u,w);
	}
	memset(dis,0x3f,sizeof(dis)); 
	q.push({0,1});
	dis[0][1]=0;
	while(q.size())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].v;
			if(dis[0][v]>dis[0][u]+e[i].w)
			{
				dis[0][v]=dis[0][u]+e[i].w;
				pre[v]=u;
				Pre[v]=i;
				q.push({dis[0][v],v});
			}
		}
	}
	path.push_back(n);
	int u=n;
	appear[u]=1;
	visit[Pre[u]]=1;
	while(pre[u])
	{
		path.push_back(pre[u]);
		appear[pre[u]]=1;
		visit[Pre[pre[u]]]=visit[(Pre[pre[u]]&1?Pre[pre[u]]+1:Pre[pre[u]]-1)]=1;
		u=pre[u];
	}
	reverse(path.begin(),path.end());
	dis[1][n]=0;
	q.push({0,n});
	memset(vis,0,sizeof(vis));
	while(q.size())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		if(appear[u])pren[u]=u;
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].v;
			if(dis[1][v]>dis[1][u]+e[i].w)
			{
				dis[1][v]=dis[1][u]+e[i].w;
				if(!appear[v])
				pren[v]=pren[u];
				q.push({dis[1][v],v});
			}
		}
	}
	memset(vis,0,sizeof(vis));
	memset(dis[0],0x3f,sizeof(dis[0]));
	q.push({0,1});
	dis[0][1]=0;
	while(q.size())
	{
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		if(appear[u])pre1[u]=u;
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].v;
			if(dis[0][v]>dis[0][u]+e[i].w)
			{
				dis[0][v]=dis[0][u]+e[i].w;
				if(!appear[v])
				pre1[v]=pre1[u];
				q.push({dis[0][v],v});
			}
		}
	}
	for(int i=0;i<path.size();i++)
	{
		to[path[i]]=i+1;
	}
	build(1,1,path.size());
	for(int i=1;i<eid;i+=2)
	{
		if(visit[i])continue;
		int u=e[i].u,v=e[i].v,w=e[i].w;
		//cout<<"deaphetS:"<<to[pre1[u]]<<' '<<to[pren[v]]<<" "<<dis[0][u]+w+dis[1][v]<<" "<<dis[0][v]+w+dis[1][u]<<"\n"; 
		if(to[pre1[u]]<=to[pren[v]])
		update(1,to[pre1[u]],to[pren[v]],dis[0][u]+w+dis[1][v]);
		if(to[pre1[v]]<=to[pren[u]])
		update(1,to[pre1[v]],to[pren[u]],dis[0][v]+w+dis[1][u]);
	}
	int ans=0;
	for(int i=1;i<=path.size();i++)
	{
		ans=max(ans,query(1,i));
	}
	print(ans);
}
2023/7/14 07:39
加载中...