BZOJ1924 所駝門王的寶藏 KEY

2022-02-09 03:28:11 字數 1370 閱讀 8719

題目傳送門

這道題苟了我好久,因為鍊錶的記憶體問題,之後再細講。

首先這是一道tarjan+dag上dp的題目。

有三種門,對於每種門可以和其他門相連。即連邊。

使用鍊錶快速查詢連邊。

建完圖後可以進行tarjan縮點。

然後做一遍dag上dp就好了。(記搜)

然後因為建圖時會有很多條邊,而行列最多只有100000個,所以要分開定義。

不然會爆記憶體。

code:

#include #include 

#include

using

namespace

std;

intread()

int n,r,c,x,y,fx,fy,o,a[100005][4

];struct

list

void add(int x,int

y)}m,nm;

struct

list2

void add(int x,int

y)}a,b;

int dfn[100005],low[100005],stack[100005],top,cnt,vis[100005],fa[100005

];int otk[100005],f[100005],sk[100005

],ans;

void tarjan(int

now)

if(dfn[now]==low[now])

return;}

int dfs(int

now)

f[now]+=sk[now];

ans=max(ans,f[now]);

return

f[now];

}int

main()

for(i=1;i<=n;i++)}}

for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);

memset(vis,

0,sizeof

vis);

for(i=1;i<=n;i++)}}

for(i=1;i<=n;i++)

for(j=m.head[i];j!=-1;j=m.nxt[j])

if(fa[i]!=fa[m.to[j]])nm.add(fa[i],fa[m.to[j]]);

memset(vis,

0,sizeof

vis);

for(i=1;i<=n;i++)

if(!otk[fa[i]]&&!vis[fa[i]])

dfs(i);

printf("%d

",ans);

return0;

}

vector版傳送門

bzoj 1924 所駝門王的寶藏

題目大意 有乙個r c的矩陣,上面有n個點有寶藏 每個有寶藏的點上都有傳送門 傳送門有三種 第一種可以傳到該行任意乙個有寶藏的點,第二種可以傳到該列任意乙個有寶藏的點,第三種可以傳到周圍的八連塊上有寶藏的點 現在你可以在任意乙個有寶藏的點開始,求你最多可以經過多少個不同的藏寶點 每個藏寶點可以多次進...

BZOJ 1924 所駝門王的寶藏 縮點 最短路

給出乙個1e6 1e6 1e6 1e6 1e6 1e 6的矩形,矩形中有三種傳送門,分別是傳送這一行的任意乙個傳送門,或者傳送到這一列的任意乙個傳送門,或者是傳送附近8 88個位置的任意乙個傳送門。然後你可以選擇並且只能選擇從任何乙個傳送門進入,從任何乙個傳送門出來。求經過最多的點的個數是多少。預處...

BZOJ 1924 Sdoi2010 所駝門的寶藏

time limit 5 sec memory limit 128 mb submit 1380 solved 603 submit status discuss 第一行給出三個正整數 n,r,c。以下 n 行,每行給出一扇傳送門的資訊,包含三個正整數xi,yi,ti,表示該傳送門設在位於第 xi行...