\(\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. 微信小程序封装mixins方法

    在app.js中这样引入 import '@src/utils/mixins' mixins函数如下 /** * 封装类似vue的混入功能 */ let native = Page Page = (o ...

  2. SSM框架——thymeleaf学习总结

    本人关于thymeleaf的学习源自: https://www.bilibili.com/video/BV1qy4y117qi 1.thymeleaf的项目搭建 首先创建springboot项目,相关 ...

  3. UML 有关类图知识及类间关系

    原文链接:https://blog.csdn.net/mj_ww/article/details/53020346 1. 类的含义 类图(Class diagram)显示了系统的静态结构,而系统的静态 ...

  4. 1000粉!使用Three.js制作一个专属3D奖牌🥇

    背景 破防了 !突然发现 SegmentFault 平台的粉丝数量已经突破 1000 了,它是我的三个博客平台掘金.博客园.SegmentFault中首个粉丝突破 1000 的,于是设计开发这个页面, ...

  5. Cesium源码剖析---Post Processing之物体描边(Silhouette)

    Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的 ...

  6. uniapp如何生成自己的小程序码并且携带参数

    生成小程序码需要用到的参数appId  appSecret这两个参数可以再微信公众平台里面登录获取 也可以用测试号里面的获取小程序码步骤1.首先要请求官方的API`https://api.weixin ...

  7. 在DigitalOcean vps中安装vnstat监控流量,浏览器打开php代码。。。

    由于DigitalOcean中没有发现可以观察已用流量的功能,有想知道自己的流量使用情况,所以安装了vnstat. 安装过程十分简单,见百度经验,官方主页等. 1.安装完vnstat后,直接命令vns ...

  8. CSS设置标签、图片放大、缩小、旋转、移动(tranform)

    CSS设置标签.图片放大.缩小.旋转.移动(tranform) 1.缩小和放大属性(scale) 格式:tranform:缩小类型(数值): 注意:缩小和放大都是 scale : 其中的值(0~1)代 ...

  9. Servlet Cookie的使用

    HTTP(超文本传输协议)是一个基于请求与响应模式的无状态协议.无状态主要指 2 点: 协议对于事务处理没有记忆能力,服务器不能自动维护用户的上下文信息,无法保存用户状态: 每次请求都是独立的,不会受 ...

  10. Web开发底层是Servlet

    SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门是做web开发. 可以理解成servlet是一个升级 web开发底层是servlet,框架是在servlet基础 ...