[題目鏈結]
[演算法]
考慮將每個"doge"向其所能到達的樓連邊
直接spfa求單源最短路可以獲得57分
那麼 , 怎樣拿到滿分呢?
我們發現這張圖的邊的數量達到了nm的數量級
考慮分塊 , 將每個點拆成sqrt(n)個點
將每個pi <= sqrt(n)的點向(bi , pi)連邊 , 這樣的邊不會超過n * sqrt(n)條
將每個pi > sqrt(n)的點向其所能到達的所有點連邊 , 這樣的邊不會超過nlogn條
時間複雜度 : o(n ^ 2) , 實際遠不能達到這個上限
[**]
#includeusingnamespace
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 個輔助點,這裡可以理解成一棟樓有許多層,每一層一步能走的範圍都不同,然後每一層分別連...