题意:给一个有向图,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与伊尔美格的更多相关文章

  1. "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)

    题目大意: n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人 问最少有几场游戏 题解: 二分 答案范围:[0,sigma a[i]] check:首先a[i]>=ans,其次 ...

  2. “东信杯”广西大学第一届程序设计竞赛(同步赛)H

    链接:https://ac.nowcoder.com/acm/contest/283/H来源:牛客网 题目描述 由于临近广西大学建校90周年校庆,西大开始了喜闻乐见的校园修缮工程! 然后问题出现了,西 ...

  3. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 I

    链接:https://www.nowcoder.com/acm/contest/122/I来源:牛客网 题目描述 小q最近在做一个项目,其中涉及到了一个计时器的使用,但是笨笨的小q却犯难了,他想请你帮 ...

  4. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)

    链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  5. 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了

    链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...

  6. 江西财经大学第一届程序设计竞赛 H题 求大数的阶乘

    链接:https://www.nowcoder.com/acm/contest/115/H 来源:牛客网 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所学的知识 ...

  7. 2018年长沙理工大学第十三届程序设计竞赛 H数学考试

    链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 江西财经大学第一届程序设计竞赛 H

    链接:https://www.nowcoder.com/acm/contest/115/H来源:牛客网 题目描述 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所 ...

  9. 长春理工大学第十四届程序设计竞赛H Arithmetic Sequence——使用特例

    题目 链接 题意:给定一个数X,输出一个等差数列,使得和为X. 分析 由等差数列的定义,可见一个数就是等差数列,两个数也是等差数列 #include<bits/stdc++.h> usin ...

随机推荐

  1. Java开发环境搭建(一)

    一.JDK与JRE JDK:Java Development Kit,Java开发工具包,是给开发人员使用的,其中包含了Java的开发工具,如java.javac.jar等命令,同时也包含了JRE. ...

  2. iOS - 静态库的导入和头文件路径的设置

    开发过程中,免不了要用到一些第三方或者是别人写好的一些Demo,这时就经常会用到别人写的一些静态库(.a文件)和n多个头文件(.h文件),这些文件不是简单地把它们拉到自己的工程里面就行的,还要设置一些 ...

  3. Fortify漏洞之 Log Forging(日志伪造)

    继续对Fortify的漏洞进行总结,本篇主要针对 Log Forging(日志伪造)的漏洞进行总结,如下: 1.1.产生原因: 在以下情况下会发生 Log Forging 的漏洞: 1. 数据从一个不 ...

  4. grpc的简单用例 (golang实现)

    这个用例的逻辑很简单, 服务器运行一个管理个人信息的服务, 提供如下的四个服务: (1) 添加一个个人信息 注: 对应于Unary RPCs, 客户端发送单一消息给服务器, 服务器返回单一消息 (2) ...

  5. 04 -- 元类和ORM

    本篇主要介绍元类,为什么说一切皆对象:如何动态的创建类等:以及ORM,即什么是ORM等知识 一.元类 1.1 在Python中一切皆对象 在学习元类中我们首先需要了解一个概念-- python中一切皆 ...

  6. swagger是什么OpenAPI是什么

    wiki: https://en.wikipedia.org/wiki/OpenAPI_Specification 官网: https://swagger.io/specification/

  7. yum源仓库的三种搭建方式

    yum源的三种搭建方式 一.  本地yum仓库的搭建 1.1.获取软件包资源 将iso镜像挂载在本地目录中,此次挂载目录为/var/www/html/repo/,此目录本身不存在,需要创建.软件宝资源 ...

  8. winform上传文件到服务器——资料整理

    标题:使用简单的wcf文件实现上传,下载文件到服务器 地址:https://blog.csdn.net/duanzi_peng/article/details/19037777

  9. 微信小程序之循环<block></block>

    (1)<block></block>标签 block常用于结合循环 <block wx:for="{{array}}" wx:key="{{ ...

  10. dt6.0之mip改造-img正则替换mip-img

    最近没事,打算把自己的小项目改造为mip,进行测试学习,想把资讯栏目:http://zhimo.yuanzhumuban.cc/news/.全部改造为mip.但是MIP改造一项是:图片标签的改造.而且 ...