AtCoder Grand Contest 036D - Negative Cycle
神仙题?反正我是完全想不到哇QAQ
这场AGC真的很难咧\(\times 10086\)
\(\bf Description\)
一张 \(n\) 个点的图,\(i\) 到 \(i+1\) 有连边。
现在来了个Snuke,他会给所有 \((i,j) ,i \ne j\) 连边,如果 \(i<j\) ,边权为 \(-1\) ,否则为 \(1\) 。
然鹅Ringo不想要图里有负环,所以他会删去Snuke加的一些边,使得图中没有负环,删除一条边有个代价,问最小的删边代价。\(3 \leq n \leq 500\)
\(\bf Solution\)
(官方题解是从 \(0\) 标号的,我是从 \(1\) 标号的,所以有一点点不一样)
对于一个没有负环的图,我们可以弄出这样一个数组 \(p\) 满足
- 对于任意 \(i\) 到 \(j\) 的边,满足 \(p_j \leq p_i + weight(i,j)\),(weight是权值,不是代价)
显然这个 \(p_i\) 是存在的,比如说是 \(1\) 到 \(i\) 的最短路。
然后令 \(q_i=p_i-p_{i+1}\) ,于是
- 对于一条 \(i → j (i>j)\) 的边,必须满足 \(p_j \leq p_i+1\),即 \(q_j+q_{j+1}+ \cdots + q_{i-1} \leq 1\)
- 对于一条 \(i → j (i<j)\) 的边,必须满足 \(p_j \leq p_i-1\),即 \(q_i+q_{i+1}+ \cdots + q_{j-1} \geq 1\)
可以发现只用考虑 \(0 \leq q_i \leq 1\)的情况 。
现在问题就简单了,对于一个 \(q\) ,只要把不符合上述条件的边都删掉就行。
用 \(f[i][j]\) 长度为 \(j\) 的数组里最后一个 \(1\) 在 \(j\) ,倒数第二个在 \(i\) ,的最小删边代价。(和官方题解是反的)
当我们从 \(f[i][j]\) 转移到 \(f[j][k]\) 时,要删去这样两种边:
- \(b → a \ (b>a), i<a \leq j, b>k\) (因为 \(b\) 到 \(a\) 有两个 \(1\) 了所以就不行)
- \(a → b, j<a<b \leq k\) (因为 \(a\) 到 \(b\) 没有 \(1\) 了所以就不行)
用前缀和就可以 \(O(1)\) 转移啦。
时间复杂度 \(O(n^3)\)
具体实现的话,用 \(w[i][j]\) 表示 \(1 \leq a \leq i , j \leq b \leq n\) ,所有 \(b → a\) 边的权值和
\(vv[i][j]\) 表示 \(i \leq a < b \leq j\) ,所有 \(a → b\) 边的权值和。
预处理一下就可以转移了。
另 \(q_0\) 和 \(q_{n+1}\) 强制为 \(1\) 可以省去对边界的特判。
#include<bits/stdc++.h>
#define LL long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=505;
const int p=998244353;
int n;
int a[N][N];
LL w[N][N],vv[N][N];
LL f[N][N];
void read(int &x){ scanf("%d",&x); }
void read(LL &x){ scanf("%lld",&x); }
LL vwv(int a,int b,int c){
return w[b][c]-w[a-1][c];
}
void chkmin(LL &x,LL y){
if (y<x) x=y;
}
int main(){
read(n);
fr(i,1,n)
fr(j,1,n)
if (i!=j) read(a[i][j]);
fr(i,1,n)
rf(j,n,i+1){
w[i][j]=w[i][j+1];
fr(k,1,i) w[i][j]+=a[j][k];
}
fr(i,1,n)
fr(j,i+1,n+1){
vv[i][j]=vv[i][j-1];
fr(k,i,j-1) vv[i][j]+=a[k][j];
}
memset(f,0x3f,sizeof f);
f[0][0]=0;
fr(i,0,n)
fr(j,i,n)
if (f[i][j]<1e18){
fr(k,j+1,n+1)
chkmin(f[j][k],f[i][j]+vv[j+1][k]+vwv(i+1,j,k+1));
}
LL ans=1e18;
fr(i,0,n) chkmin(ans,f[i][n+1]);
cout<<ans<<endl;
return 0;
}
AtCoder Grand Contest 036D - Negative Cycle的更多相关文章
- Atcoder Grand Contest 036 D - Negative Cycle
Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...
- AtCoder Grand Contest 002
AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
随机推荐
- docker 使用及基本命令
一.docker简单使用 a.列出镜像 docker images b.从docker hub拉取最新版本镜像 docker pull xxx 错误: Error response from daem ...
- 一步一步剖析Dictionary实现原理
本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...
- 后端开发实践系列之四——简单可用的CQRS编码实践
本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生. 20多年前,Bertrand Meyer在他的<Object-Oriented Software Constructi ...
- java中的char
System.out.println("char二进制位数:" + Character.SIZE);//16 即2个字节 在c语言中,char类型占一个字节,而汉子占两个字节,所以 ...
- 02-21 决策树ID3算法
目录 决策树ID3算法 一.决策树ID3算法学习目标 二.决策树引入 三.决策树ID3算法详解 3.1 if-else和决策树 3.2 信息增益 四.决策树ID3算法流程 4.1 输入 4.2 输出 ...
- 尹吉峰:使用 OpenResty 搭建高性能 Web 应用
2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,原贝壳找房基础架构部工程师尹吉峰在活动上做了<使用 O ...
- maven解决无法从远程仓库获取ojdbc问题
原因 Oracle 的 ojdbc.jar 是收费的,Maven 中央库中实际上没有此资源 解决方法 手动下载相应的jar,然后将其安装到本地仓库.具体操作如下: 1\先去下载相关的jar包或者驱动 ...
- MySQL优化与实践
一.MySQL优化概括 二.SQL优化 实践: 1.查看是否开启了慢查询日志 show variables like 'slow_query_log' 没有开启 2.查看是否开启了未使用索引SQL记录 ...
- C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
C# 委托 (一)—— 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此 ...
- MyBatis 开发手册
这一遍看Mybatis的原因是怀念一下去年的 10月24号我写自己第一个项目时使用全配置文件版本的MyBatis,那时我们三个人刚刚大二,说实话,当时还是觉得MyBatis挺难玩的,但是今年再看最新版 ...