Subtask #1 的6和7两个点总是TLE 求调
查看原帖
Subtask #1 的6和7两个点总是TLE 求调
1358555
yyyyc_2楼主2025/7/27 20:46
//李老师保佑我AC
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int prime[500005];
int buy[500005],sell[500005];
int last_buy[500005],next_buy[500005],endd_buy[500005],len_buy[500005];
bool flag_buy[500005];
int last_sell[500005],next_sell[500005],endd_sell[500005],len_sell[50005];
bool flag_sell[500005];
int money[500005];
struct yyc_buy
{
	int u;
	int dis;
	yyc_buy(int u_,int dis_)
	{
		u=u_;
		dis=dis_;
	}
};
bool operator < (yyc_buy a,yyc_buy b)
{
	return a.dis>b.dis;
}
priority_queue<yyc_buy> q_buy;
struct yyc_sell
{
	int u;
	int dis;
	yyc_sell(int u_,int dis_)
	{
		u=u_;
		dis=dis_;
	}
};
bool operator < (yyc_sell a,yyc_sell b)
{
	return a.dis<b.dis;
}
priority_queue<yyc_sell> q_sell;
int cnt=0;
void add_buy(int x,int y,int z)
{
	cnt++;
	endd_buy[cnt]=y;
	len_buy[cnt]=z;
	next_buy[cnt]=last_buy[x];
	last_buy[x]=cnt;
}
int num=0;
void add_sell(int x,int y,int z)
{
	num++;
	endd_sell[num]=y;
	len_sell[num]=z;
	next_sell[num]=last_sell[x];
	last_sell[x]=num;
}
void spfa_buy()
{
	while(!q_buy.empty())
	{
		int u=q_buy.top().u;
		q_buy.pop();
		if(flag_buy[u])
		{
			continue;
		}
		flag_buy[u]=1;
		for(int i=last_buy[u];i;i=next_buy[i])
		{
			int v=endd_buy[i];
			if(buy[v]>buy[u]||buy[v]>prime[v])
			{
				buy[v]=min(buy[u],prime[v]);
				q_buy.push(yyc_buy(v,buy[v]));
			}
		}
	}
}
void spfa_sell()
{
	while(!q_sell.empty())
	{
		int u=q_sell.top().u;
		q_sell.pop();
		if(flag_sell[u])
		{
			continue;
		}
		flag_sell[u]=1;
		for(int i=last_sell[u];i;i=next_sell[i])
		{
			int v=endd_sell[i];
			if(sell[v]<sell[u]||sell[v]<prime[v])
			{
				sell[v]=max(sell[u],prime[v]);
				q_sell.push(yyc_sell(v,sell[v]));
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>prime[i];
	}
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		if(z==1)
		{
			add_buy(x,y,1);
			add_sell(y,x,1);
		}
		else
		{
			add_buy(x,y,1);
			add_buy(y,x,1);
			add_sell(x,y,1);
			add_sell(y,x,1);
		}
	}
	for(int i=1;i<=n;i++)
	{
		buy[i]=1e18;
	}
	buy[1]=prime[1];
	q_buy.push(yyc_buy(1,0));
	sell[n]=prime[n];
	q_sell.push(yyc_sell(n,0));
	spfa_buy();
	spfa_sell();
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,sell[i]-buy[i]);
	}
	cout<<ans;
	return 0;
}

用的是dij 大佬帮忙调调吧

2025/7/27 20:46
加载中...