Time Limit: 30 Sec Memory Limit: 256 MB

Submit: 564 Solved: 304

[Submit][Status][Discuss]

Description

【故事背景】

长期的宅男生活中,JYY又挖掘出了一款RPG游戏。在这个游戏中JYY会

扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽。

【问题描述】

在这个游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻

击。两种攻击方式都会消耗JYY一些体力。采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个怪兽可能经过若干次普通攻击后变回一个或更多同样的怪兽;而采用法术攻击则可以彻底将一个怪兽杀死。当然了,一般来说,相比普通攻击,法术攻击会消耗更多的体力值(但由于游戏系统bug,并不保证这一点)。

游戏世界中一共有N种不同的怪兽,分别由1到N编号,现在1号怪兽入

侵村庄了,JYY想知道,最少花费多少体力值才能将所有村庄中的怪兽全部杀死呢?

Input

第一行包含一个整数N。

接下来N行,每行描述一个怪兽的信息;

其中第i行包含若干个整数,前三个整数为Si,Ki和Ri,表示对于i号怪兽,

普通攻击需要消耗Si的体力,法术攻击需要消耗Ki的体力,同时i号怪兽死亡后会产生Ri个新的怪兽。表示一个新出现的怪兽编号。同一编号的怪兽可以出现多个。

Output

输出一行一个整数,表示最少需要的体力值。

Sample Input

4

4 27 3 2 3 2

3 5 1 2

1 13 2 4 2

5 6 1 2

Sample Output

26

HINT

【样例说明】

首先用消耗4点体力用普通攻击,然后出现的怪兽编号是2,2和3。花费

10点体力用法术攻击杀死两个编号为2的怪兽。剩下3号怪兽花费1点体力进

行普通攻击。此时村庄里的怪兽编号是2和4。最后花费11点体力用法术攻击

将这两只怪兽彻底杀死。一共花费的体力是4+5+5+1+5+6=26。

【数据范围】

2<=N<=2*10^5,1<=Ri,Sigma(Ri)<=10^6,1<=Ki,Si<=5*10^14

Source

By 佚名上传

题解

设f[i]表示消灭i这个怪物所需要的最小花费。

f[i]一开始等于g[i];

设g[i]为用物理攻击消灭i号怪物所需的花费。

g[i]一开始等于s[i] + ∑k[i的出度];

则f[i] = min(k[i],∑f[i的出度]);

g[i]一开始等于s[i] + ∑k[i的出度];

显然g[i]这个状态不可能总是正确的。则我们需要尝试更新每一个g[i];

更新的方式是从尾往前更新。

如果发现某个x它的g值小于f值;则,我们显然可以更新那些出度有x的点三设为before的g值了。

即g[before]-=f[x];g[before]+=g[x];

因为更新了before的信息。则before之前的信息也可能更改了。则把它加进去。继续更新。

这个过程很像SPFA的更新过程。

用spfa去做吧。

建边的时候建个反图。这样就能知道某个节点它的前驱是啥了。

代码

#include <cstdio>
#include <vector>
#include <queue> using namespace std; const int MAXN = 2 * 1e5 + 10; int n;
long long si[MAXN],ki[MAXN];
vector <int> zheng[MAXN], fan[MAXN];
long long f[MAXN], g[MAXN];
queue <int> dl;
bool inque[MAXN] = { 0 }; void spfa()
{
while (!dl.empty())
{
int x = dl.front();
inque[x] = false;
dl.pop();
if (g[x] >= f[x])
continue;
int len = fan[x].size();
for (int i = 0; i <= len - 1; i++)
{
int before = fan[x][i];
g[before] -= f[x];
g[before] += g[x];
if (!inque[before])
{
inque[before] = true;
dl.push(before);
}
}
f[x] = g[x];//因为g[x] < f[x]则f[x]可以更新了
}
} int main()
{
// freopen("F:\\rush.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
dl.push(i);
inque[i] = true;
scanf("%lld%lld", &si[i], &ki[i]);
int num;
scanf("%d", &num);
for (int j = 1; j <= num; j++)
{
int y;
scanf("%d", &y);
zheng[i].push_back(y);
fan[y].push_back(i);
}
}
for (int i = 1; i <= n; i++)
{
f[i] = ki[i];
g[i] = si[i];
int len = zheng[i].size();
for (int j = 0; j <= len - 1; j++)//这只是初值。之后会更新
g[i] += ki[zheng[i][j]];
}
spfa();
printf("%lld\n", f[1]);
return 0;
}

【53.90】【BZOJ 3875】 [Ahoi2014]骑士游戏的更多相关文章

  1. BZOJ 3875: [Ahoi2014]骑士游戏 dp+spfa

    题目链接: 题目 3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MB 问题描述 [故事背景] 长期的宅男生活中,JYY又挖掘出了一 ...

  2. BZOJ 3875: [Ahoi2014]骑士游戏

    d[i]表示消灭i所需的最小体力值, d[i] = min(S[i], K[i]+Σd[x]), Σd[x]表示普通攻击而产生的其他怪兽. 因为不是DAG, 所以用个队列类似SPFA来更新答案. -- ...

  3. BZOJ 3875: [Ahoi2014]骑士游戏 spfa dp

    3875: [Ahoi2014]骑士游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3875 Description [故事背景] 长 ...

  4. [bzoj3875] [Ahoi2014]骑士游戏

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 844  Solved: 440[Submit][Status ...

  5. [BZOJ] 3875: [Ahoi2014&Jsoi2014]骑士游戏

    设\(f[x]\)为彻底杀死\(x\)号怪兽的代价 有转移方程 \[ f[x]=min\{k[x],s[x]+\sum f[v]\} \] 其中\(v\)是\(x\)通过普通攻击分裂出的小怪兽 这个东 ...

  6. bzoj 3875: [Ahoi2014&Jsoi2014]骑士游戏【dp+spfa】

    设f[i]为杀死i的最小代价,显然\( f[i]=min(k[i],s[i]+\sum f[to]) \) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的 ...

  7. [BZOJ3875][AHOI2014]骑士游戏(松弛操作)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3875 分析: 类似于spfa求最短路,设d[i]表示完全消灭i号怪物的最小花费,我们对 ...

  8. 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...

  9. 「AHOI2014/JSOI2014」骑士游戏

    「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...

随机推荐

  1. 38..Node.js工具模块---底层的网络通信--Net模块

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/ ...

  2. Flume的client

    Client:生产数据,运行在一个独立的线程.

  3. golang pipe

    ===============golang pipe============== package main import ( "fmt" "io" ) func ...

  4. js中event事件处理

    1. HTML事件  直接添加到HTML结构中 function show() { alert('hello'); } <body> <button id="btn&quo ...

  5. 对ng-repeat的表格内容添加不同样式:ng-style

    对ng-repeat的表格内容添加不同样式,html代码: <tr ng-repeat="x in tableData"> <td>{{x.networkN ...

  6. JAVA MessageDigest(MD5加密等)

    转自http://blog.csdn.net/hudashi/article/details/8394158 一.概述 java.security.MessageDigest类用于为应用程序提供信息摘 ...

  7. Windows环境下ARM集成开发环境的搭建与使用

    Windows环境下能够使用Eclipse IDE for C/C++ Developers来搭建ARM开发环境 本文地址:http://blog.csdn.net/u011833609/articl ...

  8. bitmap-setBounds方法参数研究

    对于如下的代码,一直有点不明白它具体每一步操作的影响.今天就稍微研究下.代码如下 xml代码 <RelativeLayout xmlns:android="http://schemas ...

  9. RPC调用框架比较分析--转载

    原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90 什么是RPC: RPC(Remote Pr ...

  10. JQuery 各节点获取函数:父节点,子节点,兄弟节点

    jQuery.parent(expr)           //找父元素 jQuery.parents(expr)          //找到所有祖先元素,不限于父元素 jQuery.children ...