"中国东信杯"广西大学第二届程序设计竞赛 - H - Antinomy与伊尔美格
题意:给一个有向图,n个点m条边,每个点有点权xi。规定从u点出发,到指定的k个点之一结束,可以多次经过同一个点和同一条边,求路径上点权和的最大值。
题解:直接缩点变成DAG,然后dp的时候并不是直接往父亲上面加,比如下面的4个点4条边的图:
4 4
1 2
1 3
2 4
3 4
直接往父亲上面加会导致x[4]出现了两次。
注意到这个其实是DAG,拓扑的时候把自己的值尝试更新给父亲,父亲保留所有儿子之中的最大值就可以了。
又交又WA,忘记考虑结束点的情况了。只有当这个儿子的答案中携带结束点的时候才往父亲更新,同时设置父亲的答案也是携带有结束点。
又交又T,板子里有个排序去重,5e5居然不能nlogn,好吧,それは私の過ちです。
namespace SCC {
const int MAXN = 5e5;
int n;
vector<int> G[MAXN + 5];
vector<int> BG[MAXN + 5];
int c1[MAXN + 5], cntc1;
int c2[MAXN + 5], cntc2;
int s[MAXN + 5], cnts;
int n2;
vector<int> V2[MAXN + 5];
//vector<int> G2[MAXN + 5];
vector<int> BG2[MAXN + 5];
ll val[MAXN + 5];
ll val2[MAXN + 5];
bool ok[MAXN + 5];
bool ok2[MAXN + 5];
void Init(int _n) {
n = _n;
cntc1 = 0, cntc2 = 0, cnts = 0;
for(int i = 1; i <= n; ++i) {
G[i].clear();
BG[i].clear();
c1[i] = 0;
c2[i] = 0;
s[i] = 0;
V2[i].clear();
//G2[i].clear();
BG2[i].clear();
val[i] = 0;
val2[i] = 0;
ok[i] = 0;
ok2[i] = 0;
}
}
void AddEdge(int u, int v) {
G[u].push_back(v);
BG[v].push_back(u);
}
void dfs1(int u) {
c1[u] = cntc1;
for(int v : G[u]) {
if(!c1[v])
dfs1(v);
}
s[++cnts] = u;
}
void dfs2(int u) {
V2[cntc2].push_back(u);
val2[cntc2] += val[u];
ok2[cntc2] |= ok[u];
c2[u] = cntc2;
for(int v : BG[u]) {
if(!c2[v])
dfs2(v);
}
}
void Kosaraju() {
for(int i = 1; i <= n; ++i) {
if(!c1[i]) {
++cntc1;
dfs1(i);
}
}
for(int i = n; i >= 1; --i) {
if(!c2[s[i]]) {
++cntc2;
dfs2(s[i]);
}
}
}
void Build() {
n2 = cntc2;
for(int i = 1; i <= n2; ++i) {
for(auto u : V2[i]) {
for(auto v : G[u]) {
if(c2[v] != i) {
//G2[i].push_back(c2[v]);
BG2[c2[v]].push_back(i);
}
}
}
}
for(int i = 1; i <= n2; ++i) {
//sort(G2[i].begin(), G2[i].end());
//G2[i].erase(unique(G2[i].begin(), G2[i].end()), G2[i].end());
//sort(BG2[i].begin(), BG2[i].end());
//BG2[i].erase(unique(BG2[i].begin(), BG2[i].end()), BG2[i].end());
}
}
void Solve(int u) {
for(int i = n2; i >= 1; --i) {
val[i] = 0;
ok[i] = ok2[i];
}
for(int i = n2; i >= 1; --i) {
ok[i] |= ok2[i];
if(ok[i])
val[i] += val2[i];
for(auto &v : BG2[i]) {
if(ok[i]) {
val[v] = max(val[v], val[i]);
ok[v] = 1;
}
}
}
printf("%lld\n", val[c2[u]]);
}
}
void test_case() {
int n, m;
scanf("%d%d", &n, &m);
SCC::Init(n);
while(m--) {
int u, v;
scanf("%d%d", &u, &v);
SCC::AddEdge(u, v);
}
for(int i = 1; i <= n; ++i)
scanf("%lld", &SCC::val[i]);
int u, k;
scanf("%d%d", &u, &k);
while(k--) {
int v;
scanf("%d", &v);
SCC::ok[v] = 1;
}
SCC::Kosaraju();
SCC::Build();
SCC::Solve(u);
}
"中国东信杯"广西大学第二届程序设计竞赛 - H - Antinomy与伊尔美格的更多相关文章
- "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)
题目大意: n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人 问最少有几场游戏 题解: 二分 答案范围:[0,sigma a[i]] check:首先a[i]>=ans,其次 ...
- “东信杯”广西大学第一届程序设计竞赛(同步赛)H
链接:https://ac.nowcoder.com/acm/contest/283/H来源:牛客网 题目描述 由于临近广西大学建校90周年校庆,西大开始了喜闻乐见的校园修缮工程! 然后问题出现了,西 ...
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 I
链接:https://www.nowcoder.com/acm/contest/122/I来源:牛客网 题目描述 小q最近在做一个项目,其中涉及到了一个计时器的使用,但是笨笨的小q却犯难了,他想请你帮 ...
- 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了
链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...
- 江西财经大学第一届程序设计竞赛 H题 求大数的阶乘
链接:https://www.nowcoder.com/acm/contest/115/H 来源:牛客网 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所学的知识 ...
- 2018年长沙理工大学第十三届程序设计竞赛 H数学考试
链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 江西财经大学第一届程序设计竞赛 H
链接:https://www.nowcoder.com/acm/contest/115/H来源:牛客网 题目描述 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所 ...
- 长春理工大学第十四届程序设计竞赛H Arithmetic Sequence——使用特例
题目 链接 题意:给定一个数X,输出一个等差数列,使得和为X. 分析 由等差数列的定义,可见一个数就是等差数列,两个数也是等差数列 #include<bits/stdc++.h> usin ...
随机推荐
- Linux环境Ubuntu上安装GitLab
本文主要介绍在Ubuntu[Ubuntu 18.04.3]上安装最新的GitLab版本控制工具. 一.安装更新GitLab所需要的依赖项 sudo apt-get update 下载过程中,网络要有所 ...
- 通过Git和GitHub项目管理
用Git来管理代码文件 安装环境 windows 首先是安装git: 1.到git官网下载一个安装包 2.安装git,详细过程略 3.打开项目文件夹,并鼠标右击,打开git bash 4.从未使用过g ...
- HTTP缓存字段总结
首部 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部. 请求首部:请求首部是只在请求报文中有意义的首部. 响应首部 实体首部: 用来描述HTTP报文的负荷,由于请求和响应报文中都 ...
- TR-业务流程图
今天看到一篇关于票据业务的培训文档,介绍比较全面,分享下: https://wenku.baidu.com/view/f3dd3ee988eb172ded630b1c59eef8c75ebf9577. ...
- Sqlite常用命令及基本知识
sqlite菜鸟教程:http://www.runoob.com/sqlite/sqlite-tutorial.html 常用命令: .sqlite3 --从dos命令模式进入sqlite命令 ...
- springBoot集成Redis,RedisTmple操作redis和注解实现添加和清空缓存功能
配置 maven项目进入相关配置 <dependency> <groupId>org.springframework.boot</groupId> &l ...
- Flink原理(二)——资源
前言 本文主要是想简要说明Flink在集群部署.任务提交.任务运行过程中资源情况,若表述有误欢迎大伙留言分享,非常感谢! 一.集群部署阶段 集群部署这里指的是Flink standalone模式,因为 ...
- 《发际线总是和我作队》第九次团队作业:Beta冲刺Scrum Meeting2
项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目冲刺 团队名称 发际线总和我作队 作业学习目标 (1)掌握软件黑盒测试技术:(2)掌握软件 ...
- SQL 语句中关于 NULL 的那些坑
问题描述 今天在跟进公司内部测试平台线上问题的时候,发现一个忽略已久的问题. 为了简化问题描述,将其进行了抽象. 有一张数据表qms_branch,里面包含了一批形式如下所示的数据: id name ...
- ajax同步与异步的区别
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...