首页 > 其他分享 >[NOI2020] 美食家 题解

[NOI2020] 美食家 题解

时间:2024-10-16 16:33:40浏览次数:7  
标签:log 题解 美食家 矩阵 times NOI2020 mathcal 复杂度 dp

属于是将矩阵快速幂的绝大部分技巧用到了极致的一道题。

暴力部分

首先我们先考虑一个普通 DP。

定义 \(dp_{t,i}\) 表示在时间为 \(t\) 时到达点 \(i\) 可以得到的愉悦值之和的最大值。

显然有 \((i,j)\in E \to dp_{t+w,j}=\max(dp_{t,i}+c_j)\)。特判一下当前节点有美食节的情况即可,复杂度 \(\mathcal{O}(T\times (n+m))\)。

矩阵快速幂&拆点优化

我们先暂时不考虑美食节的情况,这个后面再处理。

观察到这个 \(T\) 非常的大,但是 \(dp_t\to dp_{t+w}\) 这个东西不太好,我们当然希望是按照普通的矩阵快速幂一样,是用 \(dp_{t}\to dp_{t+1}\) 的转移矩阵进行矩阵快速幂优化。

我们考虑矩阵快速幂中一个拆点/拆边的技巧。(为啥我不知道捏)

首先一个直观的,对于边 \((i,j,w)\),你可以把他拆成 \((i,e_1,0),(e_1,e_2,0),....(e_{w-1},j,c_j)\)。(拆掉之后这个三元组的含义也变了,最后那个是边权)

这样你的转移式就变成了 \(dp_{t,i}+w\to dp_{t+1,j}\)。这样就非常容易使用矩阵快速幂优化了。

当然这里有个小细节,由于 DP 是求的 \(\max\) 这里是 \(\max\) 加矩阵乘法,不是普通的矩阵乘法,这里说明一下。

但是这样的话,复杂度仍然达到了 \(\mathcal{O}((n+4\times m)^3\times \log T)\)

我们发现这个 \(n,m\) 根本就不同阶,考虑把拆边变为拆点。

具体来说,我们将点 \(i\) 拆成 \(i_1 \to i_2 \to i_3\to i_4 \to i_5\) 边权均为 \(0\),对于原图上的边 \((i,j,w)\) 对应在拆了点的图上就是 \((i_w,j_1,c_j)\),可以发现这样的策略与刚刚拆边的效果是等价的。

此时时间复杂度来到 \(\mathcal{O}((5\times n)^3\times \log T)\)

特殊点处理

在进行了进一步的优化之后,此时我们就需要考虑一下美食节的问题了。

由于美食节会将 \(t_i\) 时,\(c_{x_i}+y_i\),改变我们的转移矩阵。故我们考虑将 \(t_i\) 看作特殊点,先求出 \(t_i-1\) 时的 \(dp_{t_i-1,x}\),然后对于 \(dp_{t_i,x}\) 进行暴力的 \(\mathcal{O}(n+m)\) 转移,然后再求出 \(t_{i+1}-1\) 的 \(dp_{t_{i+1}-1,x}\) 的值..... 依此类推。

时间复杂度 \(\mathcal{O}(k\times (n+m)+k\times (5\times n)^3\times \log T)\)。

向量乘矩阵优化

我们发现我们为了求出 \(t_i-1\) 时的 \(dp\) 值,每次都需要进行 \(\mathcal{O}(5\times n)^3\times \log T)\) 的矩阵快速幂。

有一个很逆天的东西是,转移矩阵自乘的时间复杂度是 \(\mathcal{O}((5\times n)^3)\),但是初始矩阵乘转移矩阵复杂度是 \(\mathcal{O}((5\times n)^2)\),而在我们的特殊点处理中我们进行了多次快速幂,大大增加了转移矩阵的自乘。

假设转移矩阵是 \(G\),我们考虑预处理出 \(G^{2^0},G^{2^1},...G^{2^{\log T}}\) 的所有矩阵,这样我们的每次快速幂就是用初始矩阵乘以转移矩阵,快速幂的总进行复杂度就减少为了 \(\mathcal{O}((5\times n)^2\times \log T \times k)\),总复杂度加上这个预处理就是 \(\mathcal{O}(k\times (n+m)+k\times (5\times n)^2\times \log T+(5\times n)^3\times \log T)\),发现此时可以通过。

代码暂时咕咕咕了。

标签:log,题解,美食家,矩阵,times,NOI2020,mathcal,复杂度,dp
From: https://www.cnblogs.com/SFsaltyfish/p/18466203

相关文章

  • 洛谷 P5175 数列 题解
    纯纯数学题。看到\(n\le10^{18}\)不难想到矩乘,但是\(\log_210^{18}\approx60\),再加上\(T=30000\)的多测,运算量已经来到了\(1.8\times10^6\),所以我们最多有一个\(\sqrt[3]{\frac{1.5\times10^8}{6\times10^6}}\approx4\)的矩阵。\[\becausea_i=xa_{i-1}+ya_{......
  • Project Euler 588 题解
    这玩意好像甚至有递推式……不太懂(为什么是图片?cnblogs第一个公式没渲染成功)时间复杂度是\(O(4^{\degF}\logK)\)的。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmaxn=100;intf[17][maxn],cur[10],al[4];intcalc(intK){ //cer......
  • 题解:[SNCPC2019] Pick Up
    ProblemLink[SNCPC2019]PickUp题意给出甲的坐标和速度,乙的坐标和速度,商场的坐标,可以让乙去接甲,求甲前往商场的最短用时。Solution分类讨论。思考乙是否要去接甲。这个很简单,令\(ans1\)为甲自己出发耗时,\(ans2\)为乙接甲耗时,两者取最小值即可。\(ans1\)很好算,那么\(......
  • P3794 签到题IV 题解
    题目传送门前置知识最大公约数解法\(\gcd\)和\(\operatorname{or}\)在固定左端点的情况下至多会变化\(O(\logV)\)次。以\(\gcd\)为例,考虑求出所有的四元组\((l,r,x,val)\)表示\(\foralli\in[l,r],\gcd\limits_{j=i}^{x}\{a_{j}\}=val\)。本题中因为\(x\)......
  • CF1458D Flip and Reverse 题解
    思路由于它要求\(\text{01}\)数量相等,我们可以考虑站在前缀和的角度看待这个问题。我们将\(0\)看作负一,\(1\)看作一。可以把它化成一个折线图(方便观察)。观察一下它的操作实际上在干什么。容易发现,在折线图上,我们把操作的\([l,r]\)的整段折线reverse了一遍。同样的,......
  • [题解]CF1136E Nastya Hasn't Written a Legend
    思路首先考虑操作1一个点\(i\)能被操作到的条件。注意到此时\(x\simi-1\)这些位置都是被更新过的,再仔细观察此时\(\forallj\in[x,i),a_j=a_x+\sum_{p=x}^{j-1}k_p\)。那么对于\(a_i\)如果会被修改将会变为\(a_x+\sum_{p=x}^{i-1}k_p\),那么\(a_i......
  • [ABC213G] Connectivity 2 题解
    T3[ABC213G]Connectivity2题意:给定一张无向图\(G\),将其删去\(0\) 条及以上的边构成一张新图,求对于所有点\(k\in(1,n]\),使\(k\) 与\(1\) 连通的新图的个数。比较套路的一道状压DP。尽管刚开始思考毫无头绪。Step1.令\(f_S\)表示点集为\(S\)的连通子图的个数,\(......
  • [TJOI2018] 游园会 题解
    T7[TJOI2018]游园会只能说是道有意思的好题。一般来说遇到这种题我们想到的都会是设\(f_{i,\dots}\)表示长度为\(i\),然后后面跟一堆状态的情况。此题需要我们满足两个条件:LCS的长度;不能出现\(\texttt{NOI}\)的子串。第二个限制我们可以通过状态设计来解决,但第一个......
  • [JSOI2018] 潜入行动 题解
    T6[JSOI2018]潜入行动很套路、很裸的一道树形DP。看了状态就会推方程的那种。设\(f_{u,i,0/1,0/1}\)表示以\(u\)为根的子树中有\(i\)个监听器、\(u\)有没有监听器、\(u\)有没有被监听的方案数。显然要枚举子节点\(v\)、\(u\)的监听器数量\(i\)、\(v\)的监听器数......
  • [ABC213G] Connectivity 2 题解
    [ABC213G]Connectivity2题解套路的经典图上计数题。考虑枚举和\(1\)相连的子集\(S\)。答案显然由两部分构成,\(S\)集合和\(1\)相连的方案数\(f(S)\)和\(S\)对于\(G\)的补集所有的方案数\(g(S)\)。答案就是二者相乘。显然\(g\)更好处理。直接枚举集合的边即可......