首页 > 其他分享 >[USACO22DEC] Breakdown P 题解

[USACO22DEC] Breakdown P 题解

时间:2024-09-28 14:47:40浏览次数:1  
标签:Breakdown 0x3f mathit int 题解 void st MAXN USACO22DEC

T1 [USACO22DEC] Breakdown P

比较显然的一点是,一次加一条边/一次删一条边,显然转化,这是显然的一条套路。

这题的 \(K\le8\),很有意思的数据范围,然后调用我们聪明的人类大脑得知需要用到折半搜索。所以我们只考虑 \(K\le4\) 的情况,令 \(\mathit{st}\) 表示折半搜索中考虑的起点。维护 \(1\) 到 \(n\) 不超过 \(k\) 步的最短路 \(h_i\),以及任意两点间经过条边的最短路 \(f_{i,j}\)。假若我们要更新 \(u,v,w\),然后就是神奇的部分:

  • \(K=1\),在 \(u=\mathit{st}\) 的情况下,更新 \(h_v=w\);
  • \(K=2\),对 \(\forall1\le i\le n\),更新 \(h_i\gets\min(h_i,f_{\mathit{st},i})\);
  • \(K=3\),同理,用 \(f_{\mathit{st},i}+w\) 更新 \(h_i\),其中 \(w\) 是两点间边权;
  • \(K=4\),同理,用 \(f_{st,i}+f\) 更新 \(h_i\),其中 \(f\) 是你处理好的 \(f\)。

细节懒得说了,总之单次加边复杂度均摊 \(O(n)\)。然后就没了。

void cm(int &x, int y) {
    x = x < y ? x : y;
}
constexpr int MAXN = 305;
int n, k, w[MAXN][MAXN], ans[MAXN * MAXN];
struct {
    int u, v;
} del[MAXN * MAXN];
struct {
    int st, k;
    int w[MAXN][MAXN], f[MAXN][MAXN], h[MAXN];
    void init(int _k, int _st) {
        k = _k, st = _st;
        memset(w, 0x3f, sizeof(w));
        memset(f, 0x3f, sizeof(f));
        memset(h, 0x3f, sizeof(h));
        if (!k)h[st] = 0;
    }
    void add(int u, int v, int ww) {
        w[u][v] = ww;
        if (!k)return;
        if (k == 1)return u == st && (h[v] = ww), void();
        for (int i = 1; i <= n; ++i) {
            cm(f[i][v], w[i][u] + ww);
            cm(f[u][i], ww + w[v][i]);
        }
        if (k == 2)for (int i = 1; i <= n; ++i)cm(h[i], f[st][i]);
        else {
            auto p = k == 3 ? w : f;
            if (u == st)
                for (int i = 1; i <= n; ++i)
                    for (int j = 1; j <= n; ++j)
                        cm(h[j], f[st][i] + p[i][j]);
            else
                for (int i = 1; i <= n; ++i) {
                    cm(h[i], f[st][v] + p[v][i]);
                    cm(h[i], f[st][u] + p[u][i]);
                    cm(h[u], f[st][i] + p[i][u]);
                    cm(h[v], f[st][i] + p[i][v]);
                }
        }
    }
} s, t;

signed main() {
//	freopen("data.in","r",stdin);
    n = read(), k = read();
    for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)w[i][j] = read();
    for (int i = 1; i <= n * n; ++i)del[i] = {read(), read()};
    s.init(floor(k * 0.5), 1), t.init(ceil(k * 0.5), n);
    for (int i = n * n; i; --i) {
        ans[i] = 1e9;
        for (int j = 1; j <= n; ++j)cm(ans[i], s.h[j] + t.h[j]);
        s.add(del[i].u, del[i].v, w[del[i].u][del[i].v]);
        t.add(del[i].v, del[i].u, w[del[i].u][del[i].v]);
    }
    for (int i = 1; i <= n * n; ++i)write(ans[i] == 1e9 ? -1 : ans[i]);
    return fw, 0;
}

标签:Breakdown,0x3f,mathit,int,题解,void,st,MAXN,USACO22DEC
From: https://www.cnblogs.com/laoshan-plus/p/18437943

相关文章

  • [NOIP2017 提高组] 奶酪 题解
    题目背景NOIP2017提高组D2T1题目描述现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为 z=0,奶酪的上表面为 z=h。现在,奶酪的下表面有一只小老鼠Jerry,......
  • 洛谷P1827 [USACO3.4] 美国血统 题解
    上题目:题目描述农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而不是用图形的方法。你的任务是在被给予奶牛家谱的“树中序遍历”和......
  • 洛谷P1162 填涂颜色题解
    老规矩上题目:题目描述由数字 00 组成的方阵中,有一任意形状的由数字 11 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×66×6 的方阵(n=6n=6),涂色前和涂色后的方阵如下:如果从某个 00 出发,只向上下左右 44 个方向移动且仅经过其他 00 的情况下,无法......
  • 题解 HZOJ 284 超市卖货 C/C++
    题目传送门:超市卖货-题目-OnlineJudge(haizeix.com)https://oj.haizeix.com/problem/284思路:每次寻找价格最高的商品,并尝试卖掉它:寻找未卖出商品的日期,优先锁定其保质期最后一天,若该日期已卖出则继续向前寻找能找到未卖出商品的日期时,收入增加,标记该日期代码实现:为......
  • Echarts图表知识点汇总及请求django服务器后端跨域问题解决
    1.引入echartsvue3中通过npm引入:npminstallecharts--saveimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text:'ECha......
  • P9019 [USACO23JAN] Tractor Paths P 题解
    P9019[USACO23JAN]TractorPathsP题解难度其实绝对不止蓝题。先考虑第一问。维护任意两点之间的最短路是困难的,难以dp或是采取其它方法解决。难以算最短路就转换思路,考虑从\(x\)走\(p\)步能走到哪。考虑到这个东西是有单调性的,也就是说对于\(x<y<z\),从\(x\)能走到......
  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......
  • ZZJC新生训练赛第一场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/91452下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):B,FMedium(中等):A,E,HHard(困难):C,GAnti-AK(防AK):D,Icin.tie(nullptr)->sync_with_stdio(false);//加速输入输出的A游游的整数翻转将所......
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
    【洛谷】P4819[中山市选]杀人游戏的题解题目传送门题解Tarjan我可爱的Tarjan嘻嘻qaq枚举每一个点,然后枚举每条出边,如果相连的两个点在同一个强连通分量中,或者xx......