Atcoder Grand Contest 036 D - Negative Cycle

解题思路

在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统。这一题看似和最短路没什么关系,但有一个不那么经典的推论,对于一个点 \(u\) 不在负环上的一个充要条件是

\[\forall_{\text{Edge }v\rightarrow u} dis(S,v)+weight(v, u)\geq dis(S,u)
\]

其中 \(S\) 是图中任意与 \(u\) 联通的一点。

随便新建一个源点 \(S\),我们令 \(p_i=dis(S,i)\) ,仅考虑原图的链可以得到 \(p_i \geq p_{i+1}\) 。对于任意两点 \(x,y\ (x<y)\) ,新加的边 \((x, y), (y, x)\) 需分别满足 \(p_x-1\geq p_y,p_y+1\geq p_x\) 。这里看似推不下去了然而巧妙差分后能获得非常显然的结论,令 \(q_i=p_i-p_{i+1}\) ,移项可得

\[\sum_{i=x}^{y-1} q_i \geq 1,\sum_{i=x}^{y-1}q_i \leq 1
\]

然后我们可以证明出,\(q_i \in \{0,1\}\),这里比较容易,如果 \(q_i <0\) 原链的差分约束条件就不满足,如果 \(q_i > 0\) 则点 \(i+1\) 存在额外的 \(-1\) 入边 \((v,i+1),v< i\),此时 \(v\) 到 \(i\) 最坏情况可以走一段 \(0\) 链更新,所以 \(q_i\) 最多只能为 \(1\) 。

然后我们就可以考虑 \(q_i\) 的每一位取 \(0\) 还是取 \(1\) ,然后删掉不合法的边,这个过程是可以 \(\text{DP}\) 解决的,对于不满足 \(\sum q_i \leq 1\) 的情况,在其跨过第二个 \(1\) 的时候统计掉,对于 \(\sum q_i \geq 1\) 的情况,对于每一段连续的 \(0\) 统计即可,那么就可以令 \(dp[i][j]\) 为当前考虑到前 \(i\) 位且 \(i\) 选 \(1\),上一个 \(1\) 在 \(j\) 的答案,转移使用前缀和优化即可。

code

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 505;
#define int ll
int A[N][N], B[N][N], C[N][N], D[N][N], dp[N][N], n;
signed main(){
read(n);
for(int i = 1; i <= n; i++){
for(int j = 1; j < i; j++) read(A[j][i]);
for(int j = i + 1; j <= n; j++) read(B[i][j]);
}
for(int i = 0; i <= n + 1; i++)
for(int j = i; j <= n + 1; j++){
if(i) C[i][j] += C[i-1][j];
for(int k = j; k <= n + 1; k++) C[i][j] += A[i][k];
}
for(int i = n + 1; i >= 0; i--)
for(int j = i; j <= n + 1; j++){
D[i][j] += D[i+1][j];
for(int k = i; k <= j; k++) D[i][j] += B[i][k];
}
memset(dp, 0x3f, sizeof(dp));
dp[0][0] = 0;
for(int i = 1; i <= n + 1; i++)
for(int j = 0; j < i; j++){
for(int k = 0; k <= j; k++)
dp[i][j] = min(dp[i][j], dp[j][k] + C[j][i+1] - C[k][i+1] + D[j+1][i]);
}
int ans = inf;
for(int i = 0; i <= n; i++)
ans = min(ans, dp[n+1][i]);
cout << ans << endl;
return 0;
}

Atcoder Grand Contest 036 D - Negative Cycle的更多相关文章

  1. AtCoder Grand Contest 036 A-C

    目录 \(\bf A - Triangle\) \(\bf B - Do\ Not\ Duplicate\) \(\bf C - GP 2\) \(\bf D - Negative \ Cycle\) ...

  2. AtCoder Grand Contest 036

    Preface 这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正 这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的 ...

  3. AtCoder Grand Contest 036 简要题解

    从这里开始 比赛目录 Problem A Triangle 考虑把三角形移到和坐标轴相交,即 然后能够用坐标比较简单地计算面积,简单构造一下就行了. Code #include <bits/st ...

  4. AtCoder Grand Contest 036题解

    传送门 爆炸的比较厉害--果然还是菜啊-- \(A\) 我们强制一个点为\((0,0)\),那么设剩下两个点分别为\((a,b),(c,d)\),根据叉积可以计算出面积为\(ad-bc=S\),那么令 ...

  5. AtCoder Grand Contest 002

    AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...

  6. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  7. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  8. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  9. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

随机推荐

  1. 微信小程序根据状态换图

    在index.wxml中添加图片 <image bindtap="click" src="{{show?'/images/.png':'/images/.png'} ...

  2. mac 下的 tree 命令 终端展示你的目录树结构

    相信很多使用过Linux的用户都用过tree命令,它可以像windows的文件管理器一样清楚明了的显示目录结构.mac 下使用 brew包管理工具安装 tree 前提:安装了homebrew(安装指令 ...

  3. 【LA 3942】 Remember the word

    题意 给定一个字符串和若干个单词,询问能把字符串分解成这些单词的方案数.比如abcd ,有单词a,b,ab,cd:就可以分解成a+b+cd或者ab+cd. 分析 trie树—>DP 代码 (感谢 ...

  4. 【0521模拟赛】小Z爱数学

    题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入 ...

  5. 用户账户——《Python编程从入门到实践》

    Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方 1.让用户能够输入数据 建立用于创建用户的身份验证系统之前,我们先来添加几个页面,让用户能够输入数据.当前,只有超级用户能 ...

  6. 【转】谈谈servlet、spring、struts

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  7. pypy安装与使用

    首先安装pypy环境: yum install pypy -y yum install pypy-devel -y 然后安装pypy的pip:wget https://bootstrap.pypa.i ...

  8. Linux配置crontab

    1. 添加任务(每分钟执行一次)crontab -e* * * * * /home/lings/logRotate.sh 2. 查看日志Jun 5 20:25:01 localhost CROND[8 ...

  9. Objective-C中使用不定参数个数的方法调用

    Objective-C中,定义并使用带有不定参数个数的对象方法与C函数类似,规则上也要求不定参数列表中必须至少要有一个形参,然后参数列表的最后跟省略号表示不定参数.省略号不能放在参数当中部分,只能放在 ...

  10. 【翻译】Flink Table Api & SQL — Hive Beta

    本文翻译自官网:Hive Beta https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/hive/ Flink ...