"中国东信杯"广西大学第二届程序设计竞赛 - 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 ...
随机推荐
- 1-redis使用笔记
1.清空当前redis数据库缓存FLUSHDB flushdb 2.清空整个redis缓存FLUSHALL flushall 3.设置 SET w3ckey redis 4.获取 GET w3ckey ...
- 【面试突击】- Mybatis-#{}和${}的区别
原文链接:mybatis中#{}和${}的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时 ...
- 【转载】C#中ToArray方法将List集合转换为对应的数组
在C#的List集合操作中,可以使用List集合自带的ToArray方法来将List集合转换为对应的Array数组元素.ToArray方法的签名为T[] ToArray(),存在于命名空间System ...
- python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器
目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...
- Web 标准构成
Web标准不是某一个标准,而是由W3C和其他标准化组织制定的一系列标准的集合.主要包括结构(Structure).表现(Presentation)和行为(Behavior)三个方面. 结构标准:结构用 ...
- Java面向对象程序设计----接口
接口:接口是一套规范.一个比抽象类更抽象的类. 接口中只能写抽象方法.接口中没有构造函数接口中的变量:public Stratic final接口怎么来使用(implements)实现接口 接口语法: ...
- p6.BTC-挖矿难度
挖矿就是不断调整nouce和header中其他可变字段,使得整个block header 的hash值小于等于target,target越小,挖矿难度越大. 出块时间设置为了10分钟,可以尽可能避免同 ...
- SQL SERVER-Alwayson原理
流程 1.异步提交模式 主副本无须确认该副本已经完成日志固化,就可提交事务. 主副本不受辅助副本的影响 辅助副本上的DB处于SYNCHRONIZING 2.同步提交模式 主副本要确认副本已经完成日志固 ...
- mysql查看当前实时连接数
静态查看: SHOW PROCESSLIST; SHOW FULL PROCESSLIST; SHOW VARIABLES LIKE '%max_connections%'; SHOW STATUS ...
- 为群晖加把锁:使用ssh密钥保障数据安全
对每一个使用群晖nas的人而言,能保证群晖里保存的数据不被未经授权的人访问下载甚至破坏可能是最重要的事情.但数据只要上网,就免不了担心密码被破解,群晖被侵入.现在网络上,要破解密码可能是最简单不过的事 ...