考慮列舉加油的位置,當確定某次在第$i$個位置加油後,且下一次到$j$加油,那麼$i$到$j$必然會選擇不超過$c_$條邊且最長的路徑,記作$d_$
如果能求出$d_$,再設$f_$表示$q$元(恰好用完)從$i$出發的最長路,列舉$i$之後那一次加油點即可轉移,由於$q\le n^$,因此這裡的複雜度為$o(n^)$
接下來,對其求一次字首max再二分,即可對詢問做到$o(t\log_q)$的複雜度
現在還有乙個問題,考慮如何預處理最開始的$d_$
倍增,求出從$i$出發,走不超過$2^$次走到$j$的最長路,通過列舉走$2^$時的點來轉移,可以做到$o(n^\log_c_)$
類似的,再對每乙個點$i$做一次dp,同樣列舉中專點轉移即可,時間複雜度也是$o(n^\log_c_)$
1 #include2view codeusing
namespace
std;
3#define n 105
4#define m 1005
5#define k 100005
6struct
jiedge[m];
9struct
quq[k];
12int e,n,m,t,x,y,z,head[n],p[n],c[n],g[21][n][n],ff[n],f[n][n],ans[n*n][n];
13void add(int x,int y,int
z)19
intmain()28}
29 memset(head,-1,sizeof
(head));
30for(int i=1;i<=m;i++)
34 memset(g,-0x3f,sizeof
(g));
35for(int i=1;i<=n;i++)
39for(int i=1;i<=20;i++)
40for(int x=1;x<=n;x++)
41for(int y=1;y<=n;y++)
42for(int z=1;z<=n;z++)
43 g[i][x][y]=max(g[i][x][y],g[i-1][x][z]+g[i-1
][z][y]);
44 memset(f,-1,sizeof
(f));
45for(int i=1;i<=n;i++)f[i][i]=0;46
for(int x=1;x<=n;x++)
47for(int i=0;i<=20;i++)
48if (c[x]&(1
<
54 memset(ans,-0x3f,sizeof
(ans));
55for(int i=1;i<=n;i++)ans[0][i]=0;56
for(int i=1;i<=n*n;i++)
57for(int x=1;x<=n;x++)
58if (p[x]<=i)
59for(int y=1;y<=n;y++)
60if (f[x][y]!=-1)ans[i][x]=max(ans[i][x],ans[i-p[x]][y]+f[x][y]);//
o(n^4)
61for(int i=1;i<=n*n;i++)
62for(int j=1;j<=n;j++)ans[i][j]=max(ans[i][j],ans[i-1
][j]);
63for(int i=1;i<=t;i++)
73 printf("
%d\n
",y-l);74}
75}76return0;
77 }
最佳旅遊路線
題目描述 某旅遊景區的街道成網格狀。其中東西向德街道都是旅遊街,南北向的街道都是林蔭道。由於遊客眾多,旅遊街規定為單行道,遊客在旅遊街上只能從西向東走,在林蔭道上則既可從南向北,又可從北向南走。阿龍想到這個旅遊街區遊玩。他的好友阿福給了他一些建議,用分值表示所有旅遊街相鄰兩個路口之間的街道值得遊覽程...
Loj 10159 旅遊規劃
題目說的很明確了,問點是否在最長路徑上,記錄最長次長以及最長轉移的位置。怎麼判斷點在最長路徑上,只要最長次長和向上走三者中較大的兩個的和為最長路就能說明在最長路徑上。顯然好寫。knowledge rubbish algorithm work by gym nastics time o ac incl...
CODEVS 3300 旅遊路線
有n個旅客來到了乙個旅遊景點,你作為乙個導遊要給這n個旅客安排旅遊路線。如果你安排了第i個旅客去旅遊,那麼你會得到xi的錢 若xi為負數,則你需要給他 xi的錢 對於第i個顧客,他有ki個要求。每個要求是乙個二元組 aij,bij 表示如果你安排了顧客i去,但是沒有安排顧客aij去,那麼xi就要減去...