bzoj4070 APIO2015 耶加達的摩天樓

2021-07-11 07:46:08 字數 2543 閱讀 9728

time limit: 10 sec  

memory limit: 256 mb

submit: 189  

solved: 70 [

submit][

status][

discuss]

印尼首都耶加達市有 n 座摩天樓,它們排列成一條直線,我們從左到右依次將它們編號為 0 到 n−1。除了這 n 座摩天樓外,耶加達市沒有其他摩天樓。

有 m 只叫做 「doge」 的神秘生物在耶加達市居住,它們的編號依次是 0 到 m−1。編號為 i 的 doge 最初居住於編號為 bi 的摩天樓。每只 doge 都有一種神秘的力量,使它們能夠在摩天樓之間跳躍,編號為 i 的 doge 的跳躍能力為 pi (pi>0)。

在一次跳躍中,位於摩天樓 b 而跳躍能力為 p 的 doge 可以跳躍到編號為 b−p (如果 0≤b−p

編號為 0 的 doge 是所有 doge 的首領,它有一條緊急的訊息要盡快傳送給編 號為 1 的 doge。任何乙個收到訊息的 doge 有以下兩個選擇:

跳躍到其他摩天樓上;

將訊息傳遞給它當前所在的摩天樓上的其他 doge。

請幫助 doge 們計算將訊息從 0 號 doge 傳遞到 1 號 doge 所需要的最少總跳躍步數,或者告訴它們訊息永遠不可能傳遞到 1 號 doge。

輸入的第一行包含兩個整數 n 和 m。

接下來 m 行,每行包含兩個整數 bi 和 pi。

輸出一行,表示所需要的最少步數。如果訊息永遠無法傳遞到 1 號 doge,輸出 −1。

5 30 2

1 14 1

5explanation

下面是一種步數為 5 的解決方案:

0 號 doge 跳躍到 2 號摩天樓,再跳躍到 4 號摩天樓(2 步)。

0 號 doge 將訊息傳遞給 2 號 doge。

2 號 doge 跳躍到 3 號摩天樓,接著跳躍到 2 號摩天樓,再跳躍到 1 號摩天樓(3 步)。

2 號 doge 將訊息傳遞給 1 號 doge。

子任務所有資料都保證 0≤bi

子任務 1 (10 分)

1≤n≤10

1≤pi≤10

2≤m≤3

子任務 2 (12 分)

1≤n≤100

1≤pi≤100

2≤m≤2000

子任務 3 (14 分)

1≤n≤2000

1≤pi≤2000

2≤m≤2000

子任務 4 (21 分)

1≤n≤2000

1≤pi≤2000

2≤m≤30000

子任務 5 (43 分)

1≤n≤30000

1≤pi≤30000

2≤m≤30000

分塊思想+

spfa

+建圖優化

看到題目第一眼肯定會想到最短路,但最壞情況有n^2條邊,顯然任何一種最短路演算法都不能過。

所以我們考慮用分塊的思想來優化建圖。

pi>sqrt(n),暴力加入每一條邊,每次最多sqrt(n)條邊。

pi≤sqrt(n),對於每個點新增sqrt(n)個輔助點,這裡可以理解成一棟樓有許多層,每一層一步能走的範圍都不同,然後每一層分別連邊,每一層到樓底連邊。對於乙隻doge,從樓底到pi對應的樓層連邊。邊數是o(n*sqrt(n))的。

綜上,總邊數和總點數都是o(n*sqrt(n))。

然而這道題還卡記憶體,所以要用到乙個小trick:將塊的大小和100取min。至於為什麼我也不知道,反正這就對了。

分塊思想太機智!!!

#include#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 30005*105

#define maxm 30005*500

#define inf 1000000000

using namespace std;

int n,m,s,t,tot,tmp;

int b[30005],p[30005],head[maxn],dis[maxn];

bool inq[maxn];

struct edge_typee[maxm];

queueq;

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline void add_edge(int x,int y,int v)

;head[x]=tot;

}inline void spfa()

} }}inline int num(int x,int y)

int main()

} spfa();

printf("%d\n",dis[t]);

return 0;

}

BZOJ4585 Apio2016 煙火表演

烟花表演是最引人注目的節日活動之一。在表演中,所有的烟花必須同時 為了確保安 全,烟花被安置在遠離開關的位置上,通過一些導火索與開關相連。導火索的連線方式形成 一棵樹,烟花是樹葉,如 圖1 所示。火花從開關出發,沿導火索移動。每當火花抵達乙個分 叉點時,它會擴散到與之相連的所有導火索,繼續燃燒。導火...

bzoj 3624 Apio2008 免費道路

這題一看,不是一句話題意,不想做。題意就不說了吧。首先想到的肯定是最小生成樹。然後我就想起了以前的某道題。好吧,記不大清了。我一開始的想法是貪心替換。就是先把圖構好,然後用0去換1 也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。然後隨手給自己的替代方法舉...

BZOJ 1911 APIO2010 特別行動隊

題目描述 因為是從別人部落格裡斜率優化分類一欄找的題目,所以 這題被我秒了。顯然先預處理字首和s i ik 1 xi 設 d i 為將前i 個士兵分組的最大修正後戰鬥力。d i max maxm ax a s i 2 b s i c設 kixj biyj 2a s i s j d i a s i 2...