本文共 1138 字,大约阅读时间需要 3 分钟。
我考场(线上赛)切NOI的题了!
题目链接:
n n n个点 m m m条边,每个城市有不同的愉悦值,从 1 1 1出发,要求经过 T T T的时间后回到点 1 1 1(不能原地停留。
特别的是有 k k k个美食节,在第 t i t_i ti个时刻如果在第 x i x_i xi个城市就可以额外获得 y i y_i yi的愉悦值,求路径上最大愉悦值
首先矩阵乘法变形后是可以求最长路的
之后之前有一道题目和这题很像,因为边权最大只有5,所以可以将每个点分成 5 5 5个点就可以跑矩阵乘法了。这样有 250 250 250个点,跑一次矩阵乘法是 O ( 25 0 3 log T ) O(250^3\log T) O(2503logT),不考虑美食节的情况下可以过,但是如果有美食节时间复杂度就接近 O ( k ∗ 25 0 3 log T ) O(k*250^3\log T) O(k∗2503logT)显然不可过。
然后之前有一道 N O I O n l i n e NOI\ Online NOI Online的题目正解是先预处理出 l o g T log T logT个矩阵然后再用向量乘矩阵
我们就得出了解法,我们先预处理使得 F i = A 2 i F_i=A^{2^i} Fi=A2i,然后这样我们用向量乘矩阵就是 O ( n 2 ) O(n^2) O(n2)的,之后每次做矩阵到每一个美食节,然后对于在那一天的情况加上一个愉悦值即可,可以通过本题。
时间复杂度 : O ( ( n w ) 3 log T + ( n w ) 2 k log T ) :O((nw)^3\log T+(nw)^2k\log T) :O((nw)3logT+(nw)2klogT)
#include#include #include #define p(x,y) ((x)*5+(y))#define ll long longusing namespace std;const ll N=51;struct matrix{ ll a[N*5][N*5];}f[32];struct node{ ll t,x,y;}h[210];ll n,m,T,k,tot,Size,a[N*5],p2[32],c[N*5];matrix operator*(const matrix &a,const matrix &b){ matrix c;memset(c.a,0xcf,sizeof(c.a)); for(ll i=0;i
转载地址:http://wcwaf.baihongyu.com/