傳送門
模擬賽的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,問是否存在乙個滿足所有條件的排列 考慮貪心 網路流也可以做,本質是一樣...