首页 > 其他分享 >CF1715E. Long Way Home -决策单调性、图

CF1715E. Long Way Home -决策单调性、图

时间:2024-09-06 23:46:35浏览次数:10  
标签:__ int rep Long st leq CF1715E Way dis

link:https://codeforces.com/contest/1715/problem/E

有 \(n\) 座城市,城市间有 \(m\) 条双向道路,通过第 \(i\) 条道路需要花费 \(w_i\) 的时间,任意两个城市之间都有航班,乘坐城市 \(u\) 和 \(v\) 之间的航班需要花费 \((u-v)^2\) 的时间。
现在请对于任意城市 \(i(1 \le i \le n)\),求出从城市 \(1\) 出发,到达城市 \(i\) 所需要的最短时间,注意从城市 \(1\) 到 \(i\) 的过程中最多乘坐 \(k\) 次航班
\(2 \leq n \leq 10^{5}\) , \(1 \leq m \leq 10^{5}\) , \(1 \leq k \leq 20\)


看到花费 \(=u^2 +v^2 -2uv\) 就感觉DNA动了,\(k\leq 20\) 也肯定是有用的,一个自然的想法就是做dp:\(f(i,j)\) 表示到 \(i\) 号点,使用了 \(j\) 次飞行的最小时间,那么 \(f(u,j)\) 可以是在 \(j-1\) 轮次到达某个点 \(v\) ,再从 \(v\to u\) 花费 \(u^2 +v^2 -2uv\) 的代价转移,转移式子 \(f(u,j)=u^2 +\min_v f(v,j-1)+v^2 -2uv\) 显然具有决策单调性,看成是若干条直线求上凸壳。
但也可以是在这一次之后又在图上走了一段,这部分就很麻烦了,可能需要枚举的点对很多,赛时在这里想了很久才意识到:为什么不每次转移完DP再跑一次dijkstra呢?dp求出了强制最后一下通过航班到达的最短时间,那就从 \(1\) 到每个点连上这样的边,然后再跑一次最短路就行。
(注:不能每次dp完都加上 \(O(n)\) 条边,这样就变成 \(O(nk^2 \log n)\) 了…应该记录下额外加的这 \(n-1\) 条边的编号,直接每次修改他们)

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int N=1e5+5;
constexpr ll INF=0x3f3f3f3f3f3f3f3f;
struct state{
    int x;
    ll w;
    state(int x,ll w):x(x),w(w){}
    bool operator <(const state &rhs)const{
        return w>rhs.w;
    }
};
int n,m,k;
vector<vector<pair<int,ll>>> G;
vector<ll> dijkstra(int st){
    vector<ll> dis(n+1);
    dis.assign(n+1,INF);
    priority_queue<state> Q;
    Q.emplace(st,dis[st]=0);
    while(!Q.empty()){
        auto [x,d]=Q.top();
        Q.pop();
        if(dis[x]!=d)continue;
        for(auto [v,w]:G[x])if(dis[v]>dis[x]+w)
            Q.emplace(v,dis[v]=dis[x]+w);
    }
    return dis;
}
struct Line{
    ll k,b;
    __int128 calc(int x){return (__int128)k*x+b;}
};
int main(){
    fastio;
    cin>>n>>m>>k;
    G=vector<vector<pair<int,ll>>>(n+1);
    rep(i,1,m){
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back({v,w});
        G[v].push_back({u,w});
    }
    int st=G[1].size();
    rep(i,2,n)G[1].push_back({i,INF});//i:G[1][st+i-2],
    rep(tc,1,k){
        auto d=dijkstra(1);
        vector<ll> f(n+1);
        vector<Line> S;
        rep(i,1,n){
            ll b3=(ll)i*i+d[i],k3=-2*i;
            while(S.size()>=2){
                int sz=S.size();
                auto [k1,b1]=S[sz-2];
                auto [k2,b2]=S[sz-1];
                if((__int128)(b2-b1)*k1+(__int128)b1*(k1-k2)>(__int128)(b2-b1)*k3+(__int128)b3*(k1-k2))
                    S.pop_back();
                else break;
            }
            S.push_back((Line){k3,b3});
        }
        int sz=S.size(),cur=0;
        rep(i,1,n){
            while(cur+1<=sz-1){
                auto v1=S[cur].calc(i),v2=S[cur+1].calc(i);
                if(v1>v2)cur++;
                else break;
            }
            f[i]=(ll)i*i+S[cur].calc(i);
        }
        rep(i,2,n)G[1][st+i-2].second=min(G[1][st+i-2].second,f[i]);
    }
    auto d=dijkstra(1);
    rep(i,1,n)cout<<d[i]<<' ';
    return 0;
}

标签:__,int,rep,Long,st,leq,CF1715E,Way,dis
From: https://www.cnblogs.com/yoshinow2001/p/18401230

相关文章

  • 【RAG】LongRAG:利用长上下文LLMs增强检索增强生成
    前言现有的RAG框架通常使用100词的短段落作为检索单元,这种设计使得检索器需要在大量语料库中搜索,增加了工作负担,并且容易引入难负样本,影响性能。LongRAG框架为了解决这一问题,该框架使用长检索单元(最多4K词),显著减少了语料库的大小(从22M减少到600K),从而减轻了检索器的负担,并提......
  • Long类型精度丢失
    当实体类中的字段为Long类型,且值超过前端js显示的长度范围时会导致前端回显错误。方法1使用@JsonSerialize注解的时候把Long自动转为String@JsonSerialize(using=ToStringSerializer.class)privateLongid;方法2使用@JsonFormat注解的时候把Long自动转为String@J......
  • 网站提示“502 Bad Gateway:网关或代理服务器从上游服务器收到无效响应”错误如何解决
    对于网站管理员或开发者检查高防IP配置:如果使用了高防IP服务,确保其配置正确,没有错误的路由或规则。检查负载均衡器或代理服务器配置:确保负载均衡器或代理服务器的配置正确,没有指向错误的服务器地址或端口。检查服务器健康状况:确认上游服务器是否处于工作状态,可以......
  • 第123期 Waymo自动驾驶数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。Waymo开放数据集:自动驾驶的未来之路随着科技的飞速发展,自动驾驶技术正逐渐从科幻......
  • MinimumLongestTripG
    https://www.luogu.com.cn/problem/P9981首先显而易见的是第一问的答案用拓扑排序,然后用它的倒序进行DP。我们考虑第二问。首先要保证第一问的情况下才能考虑第二问,于是我们对于所有点按照第一问的答案分层,先按照新加入的边考虑,再按照上一层点的排名考虑,做完这一层后直接对这一......
  • 【AI视频】Runway注册、基本设置、主界面详解
    博客主页:[小ᶻZ࿆]本文专栏:AI视频|Runway文章目录......
  • LongWriter-6k 数据集开发利用 AgentWrite:一种在LLM中将输出长度扩展到超过10,000字,同
    大语言模型(LLMs)的领域已经取得了巨大的进展,特别是在扩展其记忆容量以处理越来越多的上下文方面。现在这些模型可以处理超过100,000个标记的输入,使得它们能够执行高度复杂的任务,例如生成长篇文本、翻译大型文档和总结大量数据。然而,尽管在处理能力方面取得了这些进展,在生成等长......
  • SpringCloud Gateway鉴权
    参考:https://blog.csdn.net/weixin_43296313/article/details/121126811基于从前的项目:https://www.cnblogs.com/xsj1989/p/18350213在网关项目下创建全局过滤器packagecom.xcg.filters;importcom.auth0.jwt.interfaces.Claim;importcom.auth0.jwt.interfaces.DecodedJWT;......
  • CF 2001 D. Longest Max Min Subsequence(*1900) 思维
    CF2001D.LongestMaxMinSubsequence(*1900)思维题目链接题意:给你一个长度为\(n\)的序列\(a\),设\(S\)是\(a\)的所有可能的非空子序列的集合,且没有重复的元素。你的目标是找出\(S\)中最长的序列。如果有多个序列,请找出将奇数位置上的项乘以\(−1\)后,使词序最小......
  • LongWriter环境安装&推理测试
    ​引子一口气生成2万字,大模型输出也卷起来了!清华&智谱AI最新研究,成功让GLM-4、Llama-3.1输出长度都暴增。相同问题下,输出结果直接从1800字增加到7800字,翻4倍。大模型的生成内容一般都不会太长,这对于内容创作、问题回答等都存在影响,可能导致模型回答问题不全面、创造性能降低等。L......