spfa TLE 40求条
查看原帖
spfa TLE 40求条
777848
superkkkeee楼主2024/6/17 16:49

样例1死循环

样例2过了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n;
struct node
{
	int v,w;
};
vector<node> p[100001];
int dis[100001];
bool vis[100001];
int sum[100001];
int a[100001];
int ans;
queue<int> q;
const int inf=1e18;
void csh()
{
	for(int i=1;i<=n;i++) 
	{
		dis[i]=-inf;
		vis[i]=0;
		sum[i]=0;
	}
}
void hs()
{
	dis[1]=a[1];
	vis[1]=1;
	while(!q.empty()) q.pop();
	q.push(1);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(node xx:p[x])
		{
			int v=xx.v;
			int w=xx.w;
			if(dis[v]<dis[x]+w)
			{
				dis[v]=dis[x]+w;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>T;
	while(T--)
	{
		cin>>n;
		csh();
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			sum[i]=sum[i-1]+a[i];
		}
		for(int i=2;i<=n;i++) p[i].push_back({i-1,-a[i]});
		for(int i=1;i<=n;i++)
		{
			if(a[i])
			{
				int x=min(a[i]+i,n);
				p[i].push_back({x,sum[x]-sum[i]-a[i]});
			}
		}
		hs();
		ans=0;
		for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
		cout<<ans<<'\n';
	}
	return 0;
}
2024/6/17 16:49
加载中...