首页 > 其他分享 >「CF1101F」Trucks and Cities

「CF1101F」Trucks and Cities

时间:2025-01-21 12:58:34浏览次数:1  
标签:nxt CF1101F Trucks 卡车 int jump step Cities id

题意描述

有 \(N\) 座城市,第 \(i\) 座坐标为 \(a_i\) ,有 \(M\) 辆卡车,第 \(i\) 辆卡车要从城市 \(s_i\) 前往城市 \(e_i\) ,每单位长度耗油量为 \(c_i\) ,可以在中途城市加满油 \(r_i\) 次,求让所有卡车都能到达目的地最小的油箱容积。
传送门

思考&做法

step 1

先来思考暴力,二分答案,然后check所有车,时间 \(O(MN\log 10^{18})\) ,会 \(\text{TLE}\) 。
到这,就有了多个分支,有大佬改换思路用 \(\text{dp}\),用四边形不等式推决策单调性优化 \(\text{dp}\) ,也有大佬用分别二分并随机化加剪枝优化暴力的,这些当时我都没有想到,就瞪大眼睛硬做这道题。

step 2

苦思冥想的时候,yangbaich给了我一个思路:在二分 \(V\) 后首先会预处理 \(f_{i, j}\) 表示在容量为 \(V\) 时,从城市 \(i\) 到城市 \(j\) ,途中不加油,\(c\) 最大是多少,然后暴力是每次加油一次并跳一格,我们要不 \(\text{TLE}\) 就要每次不止跳一格,这时我们或许就会想到倍增,但怎么构建倍增表呢?发现对于卡车 \(i\) ,只会走 \(f_{u, v} \ge c_i\) 的边 \((u, v)\) ,所以考虑对于 \(f\) 按 \(f_{u, v}\) 从大到小排序,卡车按 \(c_i\) 从大到小排序,然后双指针运动,保证在遍历到第 \(i\) 辆卡车时会加入所有该卡车能走的边,并且没有该卡车不能走的边。

step3

本来以为能做了,只不过每次要加边,倍增表只能静态,那怎么做呢?如果没有「CF13E」Holes的经验其实很难想到动态修改的跳表。思路就是按索引分块,对于每个元素维护一个 \(nxt_i\) 表示从 \(i\) 跳一步后的位置,\(jump_i\) 表示从 \(i\) 第一次跳到下一个块的位置,\(step_i\) 表示从 \(i\) 第一次跳到下一个块的过程中跳了多少步,每次修改 \(nxt_i\) 就对所有 \(j \in [L_{bel_i}, i]\) 修改 \(jump_j\) 为 \(jump_{nxt_j} + 1\) 或 \(nxt_j\) ,分讨,并赋值 \(step_j\) 。
在查询的时候,跳的过程中每次check当前 \(r\) 是否小于 \(step_u\) ,若小,跳出循环,暴力跳 \(r\) 次 \(nxt_i\) ,返回当前点 \(u\) ,然后看 \(u\) 是否大于 \(e_i\) ,若所有卡车都大于,返回 \(\text{true}\) ,反之返回 \(\text{false}\) 。

概括

二分答案,将卡车和预处理的 \(f\) 表按 \(c_i\) 和 \(f_{i, j}\) 从大到小排序,并用双指针依次加入 \(f_{u, v}\) 的边 \((u, v)\) 并保证 \(\forall f_{u, v} > c_i\) ,用分块维护跳表,让每一辆卡车跳 \(r\) 次,check落点 \(u\) 是否大于 \(e_i\) 。
总时间复杂度 \(O(M \sqrt{N} \log 10^{18})\)

solution

/*
address:https://codeforces.com/problemset/problem/1101/F
AC 2025/1/21 11:40
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 405, M = 2.5e5 + 5;
const LL INF = 1e18;
int a[N];
int n, m;
struct truck {
    int s, f, c, r;
    bool operator < (const truck& o)const { return c > o.c; }
}c[M];
struct node {
    int x, y;
    LL c;
    bool operator < (const node& o)const { return c > o.c; }
}e[N * N];
int siz, blk;
int bel[N], nxt[N], jump[N], step[N], L[N], R[N];
inline void change(int id, int x) {
    nxt[id] = x;
    // printf("change %d -> %d ", id, x);
    for (int i = id;i >= L[bel[id]];i--)
        if (nxt[i] > R[bel[i]]) step[i] = 1, jump[i] = nxt[i];
        else step[i] = step[nxt[i]] + 1, jump[i] = jump[nxt[i]];
    // printf("step:%d\n", step[id]);
}
inline int lift(int id, int x) {
    while (true) {
        if (x < step[id]) break;
        x -= step[id];
        id = jump[id];
        // printf("%d ", id);
    }
    for (int i = 1;i <= min(x, siz);i++) id = nxt[id];
    // puts("");
    return id;
}
inline bool check(LL v) {
    // printf("%lld:\n", v);
    int t = 0;
    for (int i = 1;i <= n;i++)
        for (int j = i + 1;j <= n;j++)
            e[++t] = { i, j, v / (a[j] - a[i]) };
    sort(e + 1, e + t + 1);
    // for (int i = 1;i <= t;i++) printf("%d %d %lld\n", e[i].x, e[i].y, e[i].c);
    for (int i = 1;i <= n;i++) nxt[i] = jump[i] = i, step[i] = N;
    int j = 1;
    for (int i = 1;i <= m;i++) {
        // printf("truck %d:", i);
        while (e[j].c >= c[i].c && j <= t) {
            change(e[j].x, e[j].y);
            j++;
        }
        // puts("");
        int u = lift(c[i].s, c[i].r + 1);
        if (u < c[i].f) return false;
    }
    return true;
}
int main() {
    scanf("%d%d", &n, &m);
    siz = sqrt(n);
    blk = (n + siz - 1) / siz;
    for (int i = 1;i <= n;i++) scanf("%d", &a[i]);
    for (int i = 1;i <= n;i++) bel[i] = (i + siz - 1) / siz;
    for (int i = 1;i <= blk;i++) L[i] = (i - 1) * siz + 1, R[i] = min(i * siz, n);
    for (int i = 1;i <= m;i++) scanf("%d%d%d%d", &c[i].s, &c[i].f, &c[i].c, &c[i].r);
    sort(c + 1, c + m + 1);
    LL l = 1, r = INF, v = INF;
    while (l <= r) {
        LL mid = l + r >> 1;
        if (check(mid)) r = mid - 1, v = mid;
        else l = mid + 1;
    }
    printf("%lld", v);
    return 0;
}

总结

不知道为什么,与yangbaich做题总能做出一些奇奇怪怪的做法,只不过这样也有益于拓展思维,希望后面不知只是按题解所说去做,能多有一些自己的思考并实践。

标签:nxt,CF1101F,Trucks,卡车,int,jump,step,Cities,id
From: https://www.cnblogs.com/keysky/p/18683419

相关文章

  • AT_keyence2019_e Connecting Cities 题解
    题目传送门前置知识Boruvka算法解法考虑Boruvka算法。拆掉绝对值后得到\(a_{i}+id,a_{i}-id,a_{j}+id,a_{j}-id\)四个式子。vector启发式合并辅助线段树查询的常数过大,无法通过。上述做法的常数在于一条边会被计算两次,考虑优化。不妨直接钦定向前连、向后连的贡献,顺......
  • AT_keyence2019_e Connecting Cities 题解
    B算法萌萌题。题解看到完全图求最小生成树,必然是要考虑一下B算法能不能做的。发现这个题的联通块最小值是可以维护的。我们发现。假如我们钦定\(i\)往前面连。那么前面的最小权值必然是一个固定的值。我们一定会连到\(\min(a_j-j\timesD)\)上。由于不能连到自己......
  • [USACO16DEC] Cities and States S
    [USACO16DEC]CitiesandStatesS题目描述FarmerJohn有若干头奶牛。为了训练奶牛们的智力,FarmerJohn在谷仓的墙上放了一张美国地图。地图上表明了每个城市及其所在州的代码(前两位大写字母)。由于奶牛在谷仓里花了很多时间看这张地图,他们开始注意到一些奇怪的关系。例如,FLIN......
  • 发现这个有趣的问题Dynamic Planning Approach for Radio Tower Placement in Cities
    在ByteLand中,沿轴有n(≤105)个城市,第i个城市位于(A₁,0)(对于1≤i≤n,A≤10°)。在ByteLand,有一家制造无线电塔的电信公司。每个塔的覆盖半径为d,即,当且仅当x-y≤d时,(y,0)处的塔可覆盖(2,0)处的城市。提示:1.目标解决方案基于动态规划,2.问题陈述本身包含有关......
  • GGR273Smart Cities Bike Sharing Locations
    GGR273Lab1:SmartCities–BikeSharingLocationsLab 1:Analyzing BicyclingParking Locations inToronto(15%)Due:July 19th 2024@ 11:59 pm ESTthroughtheQuizzestabSubmitthrough Lab 1and answerquestionsandsubmitfile(.jpeg ofyour......
  • CF613D Kingdom and its Cities
    CF613DKingdomanditsCities虚树优化dp考虑无解的情况,若有两个重要城市相邻,那么无解。对于有解的情况,朴素的如何求解最少占领的城市数?考虑从叶子节点开始向上贪心,假如当前\(u\)节点为关键点,那么对于它的子树\(v\),若它的关键点能到\(v\),就要和他断开。如果\(u\)节点不......
  • CF1922C Closest Cities 题解
    解题思路贪心,能走距离最短的城市就一定走。分别考虑\(x>y\)和\(x<y\)的情况,两种情况分别是从后向前转移和从前往后转移,分别预处理一个前缀和和后缀和即可。AC代码#include<stdio.h>#include<stdlib.h>#include<valarray>#defineN100005#definelllonglongintn......
  • several top diagnostic tools available for trucks
    Heavy-dutyscantoolshavebecomeessentialforcommercialtruckfleetoperatorsandmaintenancetechnicians.Thesetoolsprovidedetailedinformationaboutthehealthofatruck'sengine,transmission,andothersystems,helpingfleetsoptimizeperf......
  • TOP 18 BEST DIAGNOSTIC TOOLS FOR TRUCKS IN 2023
    WhyHeavyDutyScanToolIsNecessary?Heavy-dutyscantoolsareessentialforcommercialtruckfleetoperatorsandmaintenancetechniciansbecausetheyprovidedetailedinformationaboutthehealthofatruck’sengine,transmission,andothersystems.Thi......
  • Ways China’s Cities Can Drive Equitable and Sustainable Urbanization
    Thefive-yearplanrepresentsanopportunitynotjusttoadvanceclimategoals,buttocreatebettercitiesasurbanizationcontinues.HerearefivewaysChina’sFive-YearPlancanhelpsteerthenationtowardachievingajusttransitionandgreenurbaniz......