首页 > 其他分享 >uoj32 跳蚤公路题解

uoj32 跳蚤公路题解

时间:2024-04-17 15:34:21浏览次数:22  
标签:uoj32 return rr read 题解 LL int ans 跳蚤

题目链接

点击打开链接

题目解法

首先问题等价于有一个负环可以到 \(v\)
假设环边的 \(w\) 之和为 \(b\),\(c\) 之和为 \(k\),则这个环的长度就为 \(kx+b\)
如果是负环,需要满足 \(kx+b<0\)
钦定负环上的一个点 \(st\),令 \(f_{i,j}\) 表示从 \(st\) 到 \(i\) 的路径中,\(\sum c=j\) 的最小的 \(\sum w\)
但这样做复杂度要到 \(O(n^5)\)

换一个角度思考问题
先考虑普通图 \(bellman-ford\) 找负环的本质,即一个点 \(x\) 被松弛 \(n\) 次就存在负环经过 \(x\)
令 \(f_{i,j}\) 表示至多经过 \(i\) 条边,到点 \(j\) 的最小距离,则有负环的形式化表达是 \(f_{n,x}<f_{n-1,x}\)

把这个式子融合到这道题中
令 \(f_{i,j,k}\) 为到点 \(i\),经过了 \(j\) 条边,\(\sum c=k\) 的 \(\sum w\) 的最小值
考虑算出每个点可能有负环的范围

具体细节比较复杂,说不清,看代码应该比较容易看懂
时间复杂度 \(O(n^3)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=110;
const LL inf=2e18;
int n,m;
LL f[N][N][N<<1];
bool can[N][N];
typedef tuple<int,int,int> tup;
vector<tup> G[N];
typedef pair<LL,LL> pll;
vector<pll> range[N];
int cur;
void trans(int u){
    can[cur][u]=1;
    for(auto [v,w,s]:G[u]) if(!can[cur][v]) trans(v);
}
LL floordiv(LL x,LL y);
LL ceildiv(LL x,LL y);
LL floordiv(LL x,LL y){
    if(x%y==0) return x/y-1;
    if(y<0) x*=-1,y*=-1;
    if(x>0) return x/y;
    return -ceildiv(-x,y);
}
LL ceildiv(LL x,LL y){
    if(x%y==0) return x/y+1;
    if(y<0) x*=-1,y*=-1;
    if(x>0) return x/y+1;
    return -floordiv(-x,y);
}
int main(){
    read(n),read(m);
    F(i,1,m){
        int x,y,w,s;read(x),read(y),read(w),read(s);
        G[x].pb({y,w,s});
    }
    F(i,1,n) F(j,0,n) F(k,0,n<<1) f[i][j][k]=inf;
    f[1][0][n]=0;
    F(tote,0,n-1)
        F(u,1,n) F(x,0,n<<1) if(f[u][tote][x]!=inf){
            chkmin(f[u][tote+1][x],f[u][tote][x]);
            for(auto [v,w,s]:G[u]) chkmin(f[v][tote+1][x+s],f[u][tote][x]+w);
        }
    F(i,1,n) F(j,-n,n) if(f[i][n][j+n]!=inf){
        LL le=-inf,ri=inf;bool fl=1;
        F(k,-n,n) if(f[i][n-1][k+n]!=inf){
            LL det=f[i][n][j+n]-f[i][n-1][k+n];
            //(k-j)x>det
            if(k-j==0){ if(det>=0) fl=0;}
            else if(k-j<0) chkmin(ri,floordiv(det,k-j));
            else chkmax(le,ceildiv(det,k-j));
        }
        if(le<=ri&&fl) range[i].pb({le,ri});
    }
    F(i,1,n) cur=i,trans(i);
    F(i,1,n){
        vector<pll> banr;
        F(j,1,n) if(can[j][i]) for(auto [l,r]:range[j]) banr.pb({l,r});
        sort(banr.begin(),banr.end());
        LL ans=0,rr=-inf-5;
        for(auto [l,r]:banr){
            if(l>rr) ans+=r-l+1,rr=r;
            else if(r>rr) ans+=r-rr,rr=r;
        }
        ans=inf+inf+1-ans;
        if(ans>1e18) puts("-1");
        else printf("%lld\n",ans);
    }
    return 0;
}

标签:uoj32,return,rr,read,题解,LL,int,ans,跳蚤
From: https://www.cnblogs.com/Farmer-djx/p/18140865

相关文章

  • 【问题解决】Fatal error "unsafe repository ('git目录名' is owned by someone else
    问题复现近期升级了Gitv2.37.0,发现在gitbash进入git目录执行git命令时出现错误:Fatalerror"unsaferepository('git目录名'isownedbysomeoneelse)",无法使用git做一些操作。问题解决两个方法:降级到v2.35.2之前,或者,gitconfig--global--addsafe.directory仓库目录......
  • 再次进入虚拟机找不到共享文件夹的内容了---问题解决
    问题描述在重新开启虚拟机之后,发现原来的路径上没有上次共享文件夹的内容了,查看虚拟机设置,发现共享文件夹还在启用,也不是这里的问题;问题解决因为我们是用链接的方式实现的本地和虚拟机文件共享,所以,每次重新进入虚拟机时,就需要重新链接一下,用下面这行代码就能够再次看到共享文件......
  • 2024/4/15考试题解
    目录成绩报告A.排座位题目内容思路代码B.梦中的学校题目内容思路代码C.激突冲击题目内容思路代码D.奖学金题目内容思路代码成绩报告T1说是快排,其实跟快排没有任何关系,就是单纯考了个语法。T2不会推式子,但是输出1有20分。T3不会差分约束(打拓扑排序导致的),同理输出-1得18分。T4fre......
  • P6864 [RC-03] 记忆 题解(评分:8.1)(2023.12.13)
    前言这下又不是官解了吧?模拟赛题,在一个月后又出现在了数据结构讲稿上,令人忍俊不禁。Solution官方解法是用线段树加矩阵,不过赛时的我显然没这么聪明,是想不到的。赛时我就只知道先发掘一些答案的性质。一、一些性质首先,发现这个撤销操作比较棘手,考虑没有撤销操作的情况下,每一......
  • P2178 [NOI2015] 品酒大会 题解(评分:8.0)(2024.2.23)
    前言"I'mfree."做法与题解区都不同,虽然麻烦,但是毕竟复杂度是对的,而且想法很自然,还是写一写吧!Solution题意:给定长为\(n\)的字符串\(s\)和长为\(n\)的数组\(A\),对于每个\(r\),求满足\(\text{LCP}(\text{Suffix}(x),\text{Suffix}(y))\ger,x<y\)的数对\((x,y)\)数......
  • [error] Error: Fail to open IDE 问题解决
    在使用HBuilder编译器,控制台报[error]Error:FailtoopenIDE 错误如下所示: 有两个原因所致:  其一:微信小程序AppID错误  解决方案:点击项目目录 manifest.json,打开项目配置,将AppID填到配置界面的微信小程序AppID输入框中,重新运行即可,如下所示: 其二:小程序打......
  • 【题解】P4307 [JSOI2009] 球队收益 / 球队预算
    P4307[JSOI2009]球队收益/球队预算题解题目传送门题意简述一共有\(n\)个球队比赛,输了赢了都会有相应的支出,现在让你安排\(m\)场比赛的输赢,是总支出最少。思路首先看到最小支出,状态不好定义,直接费用流,启动!。后文如果没有特殊说明,边的费用均为\(0\)。考虑建图,其......
  • ABC263Ex Intersection 2 题解
    ABC263ExProblem给定\(N\)条不平行的直线\(A_ix+B_iy+C=0\),\(N\)条直线总共会有\(\frac{N(N-1)}{2}\)个交点(包含在同一个位置的点,即相同位置算不同的点),找出距离原点第\(K\)近的交点的距离。$2\leN\le5\times10^4$,\(1\leK\le\frac{N(N-1)}{2}\),$-1000\le|A_i|,|B_......
  • CF154C Double Profiles 题解
    CF154CDoubleProfiles题解思路解析题目说的很明白,求有多少个无序点对\((i,j)\),使得与\(i\)直接相连的点集与直接与\(j\)相连的点集完全相等。我们想到如果直接判断每个\(i,j\)肯定会超时,所以我们想把每一个与任意一点直接相连的点集进行压缩,可以想到使用字符串哈希的......
  • [题解] [CCPC陕西省赛2022 D题] Hash
    [CCPC陕西省赛2022D题]Hash题目描述给定一个字符串\(S\),按照如下方法获取\(S\)的哈希值://LanguageC++14longlongmod=5999993;longlonggethas(strings){longlongret=0;for(charc:s)ret=(ret*29+(c-'a'+1))%mod;returnret;}找到一个......