題解 紹興一中 7 26 T3

2021-09-25 14:35:39 字數 1993 閱讀 1929

傳送門

模擬賽的t3

沒追求的我直接暴力bfs70分

很明顯的需要記錄狀態vis

[u][

hp]vis[u][hp]

vis[u]

[hp]

,表示是否出現過到點u,體力為hp這種情況

70分沒毛病

比較秒的小優化思想是記錄之前到過每個點的體力最大值,這樣bfs時如果體力大於目標點之前最大體力才入隊,vis陣列就不用搞了

減少了好多冗餘操作,這樣一優化可以過90分

最後乙個點需要2.25s,暫且當它過了吧

code:

// luogu-judger-enable-o2

#include

#define maxn 100010

using

namespace std;

struct edgeedge[maxn <<1]

;struct node

;int n, m, m, num, head[maxn]

, r[maxn]

, maxhp[maxn]

;inline

intread()

void

addedge

(int x,

int y,

int z)

; head[x]

= num;

}int

main()

maxhp[1]

= m;

queue q; q.

push

((node));

while

(!q.

empty()

));if

(v == n)}}

}puts

("-1");

return0;

}

下面是std演算法

我不想寫了,直接來std**:

#include

#include

using

namespace std;

int edge[

500000

],next[

500000

],dist[

500000

],first[

200000];

int b[

200000

],d[

200000

],g[

10000000

],h[

10000000

],p[

200000

],r[

200000];

int i,k,m,n,x,y,z,head,tail,sum_edge;

intmain()

d[1]=p[1]

=k; tail++

,g[tail]=1

,h[tail]=0

;for

(head=

1;head<=tail;head++)if

(h[head]

!=h[head-1]

)for

(i=head;i<=tail;i++

) d[g[i]

]=p[g[i]

],b[g[i]]=

0;for(i=first[g[head]

];i!=

0;i=next[i])if

((d[g[head]

]>dist[i])&&

(min

(d[g[head]

]-dist[i]

+r[edge[i]

],k)

>p[edge[i]])

)}printf

("-1\n");

return0;

}

2019暑假紹興第一中學遊記

12 40到了衢州二中,老葉講了點東西就上路 去紹興 了。路上坐大巴坐了四個小時,看 abc 寫了下他部落格的 argon 主題,然後做了會兒作業。到了紹興第一中學旁邊的某學校的交流中心下榻,和 abc 乙個房間,打了 10161.一本通 5.2 練習 4 葉子的染色,再複習了下板子 11 30 就...

紹興一中模擬賽3 19 時光流轉

離線以後點分 對於每個點,都用這個點的祖先把這個點的子樹更新一遍,考慮到操作時間早的才能更新晚的和題目中說的 路徑上邊權都大於等於val valva l 那就用樹狀陣列做一下二維偏序就行了 include using namespace std typedef long long ll define...

紹興一中模擬賽3 13 排列的區間最大值限制

有乙個大小為n n 109 n n 10 9 n n 10 9 的排列和m m 50 m m 50 m m 50 個限制,每個限制 l,r,q l,r,q l,r,q 表示在區間 l,r l,r l,r 內的最大值必須是q qq,問是否存在乙個滿足所有條件的排列 考慮貪心 網路流也可以做,本質是一樣...