APIO 2015 耶加達的摩天樓

2022-05-04 23:12:08 字數 1486 閱讀 7339

[題目鏈結]

[演算法]

考慮將每個"doge"向其所能到達的樓連邊

直接spfa求單源最短路可以獲得57分

那麼 , 怎樣拿到滿分呢?

我們發現這張圖的邊的數量達到了nm的數量級

考慮分塊 , 將每個點拆成sqrt(n)個點

將每個pi <= sqrt(n)的點向(bi , pi)連邊 , 這樣的邊不會超過n * sqrt(n)條

將每個pi > sqrt(n)的點向其所能到達的所有點連邊 , 這樣的邊不會超過nlogn條

時間複雜度 : o(n ^ 2) , 實際遠不能達到這個上限

[**]

#includeusing

namespace

std;

typedef

long

long

ll;typedef

long

double

ld;typedef unsigned

long

long

ull;

const

int inf =1e9;

const

int n = 6000050

;struct

edge

e[15000005

];int

n , m , block , tot , s , t;

inthead[n] , dist[n];

bool

inq[n];

template

inline void chkmax(t &x,t y)

template

inline void chkmin(t &x,t y)

template

inline void read(t &x)

inline

int id(int x , int

y)inline

void addedge(int u , int v , intw);

head[u] =tot;

}inline

intspfa()

}

}

}return dist[t] != 0x3f3f3f3f ? dist[t] : -1;}

intmain()

for (int j = 0; j < n; ++j) addedge(id(j , i) , id(j , 0) , 0

); }

for (int k = 1; k <= m; ++k)

if (k == 1) s = id(bi , 0

);

if (k == 2) t = id(bi , 0

); }

printf(

"%d\n

", spfa());

return0;

}

APIO2015 耶加達的摩天樓

首先可以看出這是一道求最短路的題目,但暴力建圖最多n2 條邊,所以考慮建圖優化 對於p sqrt n 的青蛙可以直接暴力建,最多n sqrt n 條邊 對於p1 define maxn 4000010ul 2 include 3 include 4 include 5 include 6 7usin...

題解 耶加達的摩天樓 APIO2015

分塊思想,機智的建圖。1.n min sqrt n 100 設乙個玄學限制,跑得會快很多。2.spfa 不要加 lll 也不要加 slf 優化!千萬不要加!不然九十八!我寫了發 spfa 時間略卡。可能 dijkstra 在這道題會更優秀一些吧 1 include 2 include 3 inclu...

AOIP 2015 耶加達的摩天樓

qwq 其實就是個最短路啊,然後發現建的邊最多會有n2 n 2條 所以我們考慮用分塊的思想來優化建圖。pi sqrt n 暴力加入每一條邊,每次最多sqrt n 條邊。pi sqrt n 對於每個點新增sqrt n 個輔助點,這裡可以理解成一棟樓有許多層,每一層一步能走的範圍都不同,然後每一層分別連...