CCF 20171203(商路)

题目分析:

    题目很长,有点儿不理解,后来看人家的代码,边看边调,才知道自己误解了题目的意思。

    本来想着应该是dp,就是每个城市的商路最大价值是它的下级中的最大价值或者是它到其中一个城市的价值。后来发现不可以是取它下级中的最大价值,因为这个城市的商路最大价值是有可能小钰它下级的最大价值的。所以应该在每一个最后的没有下级的城市向上遍历它的上级,即不断更新如果上级直接到这个城市的最大价值。

    未满分。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn  = 100010;
const long long Mod = 1e18;
long long f[maxn],u[maxn],s[maxn],v[maxn];
long long ans[maxn];
long long q[maxn];
int vis[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		memset(q,0,sizeof(q));
		memset(ans,0,sizeof(ans));
		
		int n;
		scanf("%d",&n);
		
		for(int i = 1; i <= n; i ++)
		{
			scanf("%d%d%d%d",&u[i],&s[i],&v[i],&f[i]);
			vis[u[i]]++;
		}
		 int q1=0,q2=0;
		 for(int i = 1; i <= n; i ++)
			if(vis[i] == 0 )
				q[q1++] = i;
			
		while(q1 > q2)
		{
			int k = q[q2++];
			int u1 = u[k];
			int d = s[k];
			vis[u1]--;
			if(vis[u1] == 0) q[q1++] = u1;
			while(u1)
			{
				ans[u1] = max(ans[u1],ans[k] + v[u1] - (f[u1]-d)*(f[u1]-d));
				d += s[u1];
				u1 = u[u1];
				
			}
			
				 
		}
		long long cnt=0;
		for(int i=1 ; i <= n; i++)
			cnt =(cnt + ans[i])%Mod;
		cout<<cnt<<endl;
	}	
	return 0;
 } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值