CodeForces 1388D Captain Flint and Treasure
题意
给长度为\(n\)的序列\(a[n]\)和\(b[n]\),初始时\(ans=0\),有以下操作:
- \(ans=ans+a[i]\)
- 如果\(b[i]\neq-1\),则\(a[b[i]]=a[b[i]]+a[i]\)
问每个元素操作一次后,\(ans\)最大为多少,并输出操作序列
分析
对于一个数,如果他有前驱的话,可以考虑对于其某些前驱进行操作后再操作该数,那么画一个前驱图可以发现,这是一个拓扑排序的题,操作到某个节点时
- 如果该节点的值大于\(0\),说明将其操作到后续节点一定是更优的
- 否则,这个节点一定要晚于其后续节点操作,否则会将该节点的值再贡献一次
那么拓扑排序的时候维护一个队列和一个栈,对于值大于\(0\)的节点,将其放入队列中,然后将其值加入后续节点,否则将其放入栈中(因为若连续两个节点值都小于\(0\),那么应先操作后续节点),最后输出即可
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
#define rep(z, x, y) for(int z=x;z<=y;++z)
#define repd(z, x, y) for(int z=x;z>=y;--z)
#define com bool operator<(const node &b)const
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
const int maxn = (ll) 3e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
int T = 1;
int a[maxn], b[maxn];
vector<int> v[maxn];
int in[maxn];
void solve() {
int n;
cin >> n;
rep(i, 1, n)cin >> a[i];
rep(i, 1, n) {
cin >> b[i];
if (b[i] != -1) {
v[i].push_back(b[i]);
++in[b[i]];
}
}
int ans = 0;
queue<int> q;
rep(i, 1, n) {
if (in[i] == 0) {
q.push(i);
}
}
vector<int> tmp;
stack<int> last;
while (!q.empty()) {
int now = q.front();
if (a[now] > 0)
tmp.push_back(now);
else
last.push(now);
ans += a[now];
q.pop();
for (auto &to:v[now]) {
if (a[now] > 0)
a[to] += a[now];
--in[to];
if (in[to] == 0) {
q.push(to);
}
}
}
cout << ans << '\n';
for (auto &to:tmp)cout << to << ' ';
while (!last.empty()) {
cout << last.top() << ' ';
last.pop();
}
}
signed main() {
start;
while (T--)
solve();
return 0;
}
CodeForces 1388D Captain Flint and Treasure的更多相关文章
- Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
题目链接:Captain Flint and Treasure 题意: 一种操作为 选一个下标 使得ans+=a[i] 且 把a[b[i]]+a[i] 要求每个下标都进行一种这样的操作,问怎么样的 ...
- Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage
题目链接:Captain Flint and Crew Recruitment 题意: t组输入,每一组输入一个n.这里我们说一下题目定义的近似质数概念: "如果可以将正整数x表示为p⋅q, ...
- codeforces 677D D. Vanya and Treasure(二维线段树)
题目链接: D. Vanya and Treasure time limit per test 1.5 seconds memory limit per test 256 megabytes inpu ...
- Codeforces 505C Mr. Kitayuta, the Treasure Hunter:dp【考虑可用范围】
题目链接:http://codeforces.com/problemset/problem/505/C 题意: 有n个宝石,分别在位置p[i].(1 <= n,p[i] <= 30000) ...
- 【12.78%】【codeforces 677D】Vanya and Treasure
time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...
- codeforces 505C Mr. Kitayuta, the Treasure Hunter(dp)
题意:有30001个岛,在一条线上,从左到右编号一次为0到30000.某些岛屿上有些宝石.初始的时候有个人在岛屿0,他将跳到岛屿d,他跳跃的距离为d.如果当前他跳跃的距离为L,他下一次跳跃的距离只能为 ...
- Codeforces 704D Captain America
题意:平面上有n个点,每个点必须涂成红色和蓝色中的一种,花费各为r和b(对所有的点花费都一样).m条限制,每条限制形如"y=b这条直线上两种颜色的点的数目之差的绝对值不能超过c"或 ...
- Codeforces 474C Captain Marmot 给定4个点和各自旋转中心 问旋转成正方形的次数
题目链接:点击打开链接 题意: 给定T表示case数 以下4行是一个case 每行2个点,u v 每次u能够绕着v逆时针转90° 问最少操作多少次使得4个u构成一个正方形. 思路: 枚举判可行 #in ...
- [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
Description The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The is ...
- UVALive - 5857 Captain Q's Treasure
UVALive - 5857 思路: 状压dp,用map写 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimi ...
随机推荐
- 代码随想录算法训练营Day24 回溯算法|216.组合总和III 17.电话号码的字母组合
代码随想录算法训练营 216.组合总和III 题目链接:216.组合总和III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说 ...
- defcon-quals 2023 crackme.tscript.dso wp
队友找到的引擎TorqueGameEngines/Torque3D (github.com) 将dso文件放到data/ExampleModule目录下,编辑ExampleModule.tscript ...
- cve_2020_6507分析
poc $ cat poc.js array = Array(0x40000).fill(1.1); args = Array(0x100 - 1).fill(array); args.push(Ar ...
- 关于建立一个Java项目全过程(专对于新手)
关于建立一个Java项目全过程 一.Java开发环境搭建 1.JDK与JRE JDK = JRE + 开发工具集(例如Javac编译工具等) JRE = JVM + Java SE标准类库 2.JDK ...
- rust实现weatherforecast的获取天气webapi
rust用来写webapi可能有点大材小用,但是作为入门学习应该说是不错的选择. cargo new webapi创建一个webapi项目,在src下面新建handler文件夹和models文件夹. ...
- CSI架构和原理
CSI CSI简介 CSI的诞生背景 K8s 原生支持一些存储类型的 PV,如 iSCSI.NFS.CephFS 等等,这些 in-tree 类型的存储代码放在 Kubernetes 代码仓库中.这里 ...
- CAPL 脚本对信号收发的判断
在CAPL脚本中,您可以使用条件语句和CAN消息的收发函数来进行信号的判断和处理.以下是一些常见的CAPL脚本语句用于信号收发的判断: 1.判断消息是否收到 on message can_messag ...
- JUC同步锁原理源码解析四----Semaphore
JUC同步锁原理源码解析四----Semaphore Semaphore 1.Semaphore的来源 A counting semaphore. Conceptually, a semaphore ...
- js如何操作video标签
一.简介 在做web ui自动化时,遇到操作视频的时候有时比较让人头疼,定位时会发现只有一个<video>标签,用selenium来实现的话比较麻烦,使用js后我们只需定位到video标签 ...
- 一文掌握设计模式(定义+UML类图+应用)
一.引子 从学编程一开始就被告知,要想做一名优秀的程序员两大必要技能:1.源码阅读(JDK.C等底层语言封装) 2.设计模式(使用某种语言优雅的落地典型场景功能).一般随着工作年限的增长,被迫对底层语 ...