\(\mathcal{Description}\)

  Link.

  给定一个 \(n\) 个点 \(m\) 条边的带权有向图,每条边还有属性 \(s\in\{-1,0,1\}\)。对于每个 \(u\in[1,n]\),求有多少个 \(x\in\mathbb Z\),使得图上所有属性为 \(-1\) 的边权 \(-x\),为 \(0\) 的不变,为 \(1\) 的 \(+x\) 后,从 \(1\) 走到 \(u\) 的任意路径不经过负环。若存在无穷个 \(x\),输出 \(-1\)。

  \(n\le100\),\(m\le10^4\)。

\(\mathcal{Solution}\)

  可以发现,对于任意初始权和为 \(b\) 的简单环,设其上 \(\sum_us_u=k\),则简单环的最终权值为 \(kx+b\),是一个一次函数,我们需要保证它非负。

  难免涉及到找负环,首先排除 SPFA,我们可以利用 Bellman-Ford 找负环:令 \(f(i,u)\) 表示从起点走 \(i\) 步到达 \(u\) 的最短路,若 \(f(n-1,u)\le f(n,u)\),则 \(u\) 和 \(u\) 可达的点都受负环影响。

  扩展到本题,我们需要记录 \(k\),那么令 \(f(i,u,k)\) 表示从起点走 \(i\) 步到达 \(u\),经过边的属性和为 \(k\) 的最短路,这个表可以暴力 \(\mathcal O(n^3m)\) 刷出来。对于一个确定的 \(x\),若 \(u\) 被负环影响,联系上面二维情况下的式子,就有:

\[\min_j\{f(n-1,u,j)+jx\}\le\min_k\{f(n,u,k)+kx\}
\]

  枚举 \(j,k\),若 \(j<k\),可以得到一个 \(x\) 的限制:

\[x\ge\frac{f(n-1,u,j)-f(n,u,k)}{k-j}
\]

  其余情况类似。这样对于每个结点,我们可以求出关于其的若干限制区间 \((l,r)\),表示合法的 \(x\not\in(l,r)\)。求答案时,枚举每个点 \(u\) 和其可达的点 \(v\),求 \(v\) 上限制的交集即可。

\(\mathcal{Code}\)

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm> typedef long long LL;
typedef std::pair<LL, LL> pll; inline char fgc () {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread ( p = buf, 1, 1 << 17, stdin ), p == q ) ? EOF : *p ++;
} inline int rint () {
int x = 0, f = 1; char s = fgc ();
for ( ; s < '0' || '9' < s; s = fgc () ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = fgc () ) x = x * 10 + ( s ^ '0' );
return x * f;
} inline void wint ( LL x ) {
if ( x < 0 ) putchar ( '-' ), x = -x;
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
} const int MAXN = 100, MAXM = 1e4;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
LL pool[MAXN + 5][MAXN + 5][MAXN * 2 + 5];
bool rch[MAXN + 5][MAXN + 5];
std::vector<pll> restr[MAXN + 5], inter; struct Edge {
int u, v, w, s;
} eset[MAXM + 5]; inline void chkmin ( LL& a, const LL b ) { if ( b < a ) a = b; }
inline void chkmax ( LL& a, const LL b ) { if ( a < b ) a = b; } inline LL& f ( const int i, const int j, const int k ) { return pool[i][j][k + n + 2]; } int main () {
// freopen ( "city.in", "r", stdin );
// freopen ( "city.out", "w", stdout );
n = rint (), m = rint ();
for ( int i = 1; i <= n; ++ i ) rch[i][i] = true;
for ( int i = 1, u, v, w, s; i <= m; ++ i ) {
u = rint (), v = rint (), w = rint (), s = rint ();
eset[i].u = u, eset[i].v = v, eset[i].w = w, eset[i].s = s;
rch[u][v] = true;
}
for ( int k = 1; k <= n; ++ k ) {
for ( int i = 1; i <= n; ++ i ) {
for ( int j = 1; j <= n; ++ j ) {
rch[i][j] |= rch[i][k] && rch[k][j];
}
}
}
for ( int j = 1; j <= n; ++ j ) {
for ( int k = -n; k <= n; ++ k ) {
f ( 0, j, k ) = INF;
}
}
f ( 0, 1, 0 ) = 0;
for ( int i = 1; i <= n; ++ i ) {
for ( int j = 1; j <= n; ++ j ) {
for ( int k = -n; k <= n; ++ k ) {
f ( i, j, k ) = f ( i - 1, j, k );
}
}
for ( int j = 1; j <= m; ++ j ) {
int u = eset[j].u, v = eset[j].v, w = eset[j].w, s = eset[j].s;
for ( int k = -n; k <= n; ++ k ) {
if ( f ( i - 1, u, k ) == INF ) continue;
chkmin ( f ( i, v, k + s ), f ( i - 1, u, k ) + w );
}
}
}
for ( int i = 1; i <= n; ++ i ) {
for ( int k = -n; k <= n; ++ k ) {
if ( f ( n, i, k ) >= f ( n - 1, i, k ) ) continue;
LL l = -INF, r = INF; // x\in(-INF,l]+[r,INF).
for ( int j = -n; j <= n; ++ j ) {
if ( j == k || f ( n - 1, i, j ) == INF ) continue;
if ( j < k ) {
chkmin ( r, ceil ( 1.0 * ( f ( n - 1, i, j ) - f ( n, i, k ) ) / ( k - j ) ) );
} else {
chkmax ( l, floor ( 1.0 * ( f ( n - 1, i, j ) - f ( n, i, k ) ) / ( k - j ) ) );
}
}
if ( l < r ) restr[i].push_back ( pll ( l, r ) );
}
}
for ( int i = 1; i <= n; ++ i ) {
inter.clear ();
for ( int j = 1; j <= n; ++ j ) {
if ( rch[1][j] && rch[j][i] ) {
for ( int k = 0; k ^ restr[j].size (); ++ k ) {
inter.push_back ( restr[j][k] );
}
}
}
if ( inter.empty () ) { puts ( "-1" ); continue; }
std::sort ( inter.begin (), inter.end () );
LL l = INF, r = -INF, las = -INF; bool found = false;
for ( int j = 0; j ^ inter.size (); ++ j ) {
if ( !j && inter[j].first > -INF ) {
l = -INF, r = inter[j].first;
found = true; break;
}
if ( las != -INF && las <= inter[j].first ) {
l = las, r = inter[j].first;
found = true; break;
}
chkmax ( las, inter[j].second );
}
if ( !found && las < INF ) l = las, r = INF;
wint ( l == -INF || r == INF ? -1 : ( l <= r ? r - l + 1 : 0 ) );
putchar ( '\n' );
}
return 0;
}

\(\mathcal{Details}\)

  关于负环的做得太少,拿着就不知所措 qwq,而且考场上前面浪费太多时间根本没来得及向这题……

Solution -「UR #2」「UOJ #32」跳蚤公路的更多相关文章

  1. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  2. 「UR#6」懒癌

    「UR#6」懒癌 妈妈我居然看了六个小时题解,快救救乌干达的可怜儿童吧. 接下来开始膜官方题解: ​ 其实就算有上面两个结论也不是很好想到任意复杂度的做法,关键在于要想到一个人是怎么推断自己的狗是不是 ...

  3. 「UR#5」怎样更有力气

    「UR#5」怎样更有力气 解题思路 考虑没有限制的情况,一定是把操作离线下来,按照边权从小到达做.可以发现,如果没有限制,完全图是多余的,直接拿树边进行合并就可以了.我们要做这么一件事情,把每个点属于 ...

  4. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  5. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  6. 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp

    「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...

  7. 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)

    「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...

  8. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  9. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

随机推荐

  1. nuxt创建项目

    1.使用 npm 安装 npm install -g vue-cli 2.安装nuxt项目 vue init nuxt-community/koa-template 项目名称 3.如果 vue-cli ...

  2. Android官方文档翻译 九 2.2Adding Action Buttons

    Adding Action Buttons 增加动作按钮 This lesson teaches you to 这节课教给你 Specify the Actions in XML 在XML中指定动作 ...

  3. Go语言测试:testing

    学习参考来源:https://www.liwenzhou.com/posts/Go/16_test/ go test工具 必须导入包: import "testing" go te ...

  4. 2月1日 体温APP开发记录

    1.阅读构建之法 现代软件工程(第三版) 2.观看Android开发视频教程最新版 Android Studio开发

  5. azure django bug

    azure web app service azure web app service无法部署dhango网站 本地服务器测试代码 实际azure测试 django service 没有部署选项,需要 ...

  6. vue学习17-插槽作用域

    <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http ...

  7. @WebServlet注解(Servlet注解)

    @WebServlet 注解的属性 @WebServlet 用于将一个类声明为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet.该注解具有下表给出 ...

  8. Go 变量及基本数据类型2

    #### Go 变量及基本数据类型(二)今天学习一下基本数据类型,包括整数类型,小数类型,字符类型##### 整数类型用来存放整数数值的, 如0,1,-10,2222等; 整数型的类型有: 类型 有无 ...

  9. pycharm 安装插件

    1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...

  10. Matplotlib直方图绘制技巧

    情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...