codeforces 660 div2 D
题目
好妙,可以用拓扑排序去做。
首先我们要明白,我们先统计正数的,再去统计负数,这么做是最优的。正数的话,加上去另个一个数,一定会使得答案更优,而且题目说保证不会成环,所以拓扑排序是可以的。然后我们对负数的处理就是,按照拓扑序逆序处理。因为负数无论加到哪里,都会使得答案变差,按照拓扑序逆序,可以防止负数加到另一个数,具体细节看代码吧。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#include<list>
#include<queue>
#define int long long
using namespace std;
int n,a[200005],b[200005],ru[200005],ans=0,v1[200005],v2[200005],cnt1,cnt2;
list<int>lis[200005];
queue<int>q;
signed main()
{cin>>n;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}for(int i=1;i<=n;i++){scanf("%lld",&b[i]);if(b[i]==-1)continue;lis[i].push_back(b[i]);ru[b[i]]++;}for(int i=1;i<=n;i++){if(!ru[i])q.push(i);}while(!q.empty()){int x=q.front();q.pop();ans+=a[x];for(list<int>::iterator it=lis[x].begin();it!=lis[x].end();it++){ru[*it]--;if(!ru[*it])q.push(*it);if(a[x]>0)a[*it]+=a[x];}if(a[x]>=0)v1[++cnt1]=x;else v2[++cnt2]=x;}cout<<ans<<endl;for(int i=1;i<=cnt1;i++){printf("%lld ",v1[i]);}for(int i=cnt2;i>=1;i--){printf("%lld ",v2[i]);}
}
codeforces 660 div2 D相关推荐
- codeforces#320(div2) D Or Game 贪心
codeforces#320(div2) D "Or" Game 贪心 D. "Or" Game time limit per test 2 seconds ...
- codeforces 628.div2
# Codeforces 628.div2 A. EhAb AnD gCd B. CopyCopyCopyCopyCopy C. Ehab and Path-etic MEXs D. Ehab the ...
- codeforces#324(div2) E. Anton and Ira 贪心
codeforces#324(div2) E. Anton and Ira 贪心 E. Anton and Ira time limit per test 1 second memory limit ...
- codeforces 712 div2 ABC
codeforces 712 div2 ABC A. Déjà Vu A palindrome is a string that reads the same backward as forward. ...
- codeforces round div2,3周赛补题计划(从开学到期末)
1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...
- Codeforces#371 Div2
这是一场非常需要总结的比赛,交了3题,最后终测的时候3题全部没过,一下掉到了绿名,2333 Problem A 题意:给定区间[l1,r1],[l2,r2],然后给定一个整数k,求区间当中相交的元素, ...
- 【Codeforces #130 Div2】Solutions
[208A Dubstep] http://codeforces.ru/problemset/problem/208/A 题目大意:一个句子被添加了若干"WUB",问原句. 将W ...
- 付忠庆的练习小笔记-Codeforces #277 Div2 C
原题链接 http://codeforces.com/contest/486/problem/C 这个C题显然更水一些 步数可以分为两种 上下一种 左右一种 总步数最小 = 上下最小+左右最小 先讨论 ...
- 付忠庆的练习小笔记-Codeforces #276 Div2 C
原题链接 http://codeforces.com/contest/485/problem/C 题意:给出一个区间 l~r 求这个区间内的数中转换成2进制含'1'最多的数,若有多组解,则输出最小的那 ...
最新文章
- 开发日记-20190719 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 12
- WebRTC视频编解码器性能评估
- 排队问题解题思路_青岛版二年级数学下册8.2除加除减解决问题微课视频辅导+练习...
- Python学习——常见的字符串匹配
- Eclipse的Ctrl+Shift+R中过滤文件类型
- 64位ubuntu12 编译android4.4.2
- ERROR: libass not found using pkg-config2
- 掌财社:传联想控股收身而退 放弃参与高盛投行计划
- STAMP:扩增子、宏基因组统计分析神器(中文帮助文档)
- 微型计算机中的西文字符编码,在微型计算机中,应用最普遍的西文字符编码是什...
- 郑州大学计算机专业国际学院,郑州大学国际学院怎么样?郑州大学国际学院好吗?(历年分数、专业设置、校园环境、教学实力、名人校友) - 职友集...
- 文明5 java 英_文明5模组“Future Worlds”(未来世界)中英版补丁
- 小女子做销售 四大温柔手段
- win10多任务处理快捷键
- ST电机库v5.4.4源代码分析(7): SpeednPosFdbk_Handle_t在几个结构体中的关系
- void指针(void*):void*存放任意对象的地址、通过(int*)a转换指针类型
- @Alias使用技巧
- 语音识别 - ASR whisper
- 微信小程序中的onLoad
- android mvvm官方文档,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现