D. Skipping

D06發表於2024-10-23
  • 【知難而退】,難以實時維護一個位置對應的下一個位置,那就透過一定的性質避開這個問題
  • 【列舉】到達的最右邊的位置
  • 真沒想到在這種特殊圖上也能卡spfa啊……
點選檢視程式碼
#include <bits/stdc++.h>
using namespace std;
vector<int>a[400005];
vector<int>c[400005];
int val[400005],b[400005];
long long sum[400005],d[400005];
bool v[400005];
/*
queue<int>q;
void spfa()
{
	d[1]=0;
	v[1]=true;
	q.push(1);
	while(q.size())
	{
		int n1=q.front();
		q.pop();
		v[n1]=false;
		for(int i=0;i<a[n1].size();i++)
		{
			if(d[n1]+c[n1][i]<d[a[n1][i]])
			{
				d[a[n1][i]]=d[n1]+c[n1][i];
				if(!v[a[n1][i]])
				{
					v[a[n1][i]]=true;
					q.push(a[n1][i]);
				}
			}
		}
	}
}
*/
typedef pair<long long,int> cc;
priority_queue<cc,vector<cc>,greater<cc> >q; 
void dijkstra()
{
	d[1]=0;
	q.push(make_pair(0,1));
	while(q.size())
	{
		int n1=q.top().second;
		q.pop();
		if(v[n1])
		{
			continue;
		}
		v[n1]=true;
		for(int i=0;i<a[n1].size();i++)
		{
			if(d[n1]+c[n1][i]<d[a[n1][i]])
			{
				d[a[n1][i]]=d[n1]+c[n1][i];
				q.push(make_pair(d[a[n1][i]],a[n1][i]));
			} 
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			a[i].clear();
			c[i].clear();
			d[i]=LLONG_MAX;
			v[i]=false;
		}
		for(int i=1;i<=n;i++)
		{
			cin>>val[i];
			sum[i]=sum[i-1]+val[i];
		}
		for(int i=1;i<=n;i++)
		{
			cin>>b[i];
			if(i>1)
			{
				a[i].push_back(i-1);
				c[i].push_back(0); 
			}
			a[i].push_back(b[i]);
			c[i].push_back(val[i]);
		}
		dijkstra();
		long long ans=0;
		for(int i=1;i<=n;i++)
		{
			ans=max(ans,sum[i]-d[i]);
		}
		cout<<ans<<"\n";
	}
	return 0;
}

相關文章