XSY2771 城市 分治

2022-03-25 17:38:26 字數 1450 閱讀 1722

乙個平原上有\(n\)個城市,第\(i\)個城市在點\((\cos \frac,\sin \frac)\)上。

每個城市和最近的兩個城市有一條直線段的路。

此外,還有\(n-3\)條路,這些路不會和原有的路重合,這些路之間也不會相交。

通過每條道路均要花費\(1\)的時間。

每次給你兩個城市,問你從乙個城市到另乙個城市最快要多久。

\(n\leq 100000\)

先把圖畫出來,容易發現這是乙個平面圖,且這個圖的對偶圖是一棵樹,每個點的度數不超過\(3\)。

那麼我們可以對這棵樹分治(點分治邊分治都可以)。

每次選擇一條邊,對於每個詢問,這個詢問的最短路徑可以經過這條邊的兩個端點,也可以不經過。

那麼可以從這條邊的兩個端點開始bfs,並更新答案。

對於乙個詢問,如果這個詢問的兩個點不在這條邊的同一側,就可以把這個詢問扔掉了,否則遞迴下去處理。

時間複雜度:\(o(n\log n)\)

#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;typedef pairpii;void open(const char *s)int rd()

vectorg[100010];

int e[100010][3];

int qu[100010][3];

int c[100010];

int ti;

int tot;

int b[100010];

queueq;

int num[100010];

int ans[100010];

int d[100010];

void bfs(int x) }}

int cnt;

int dist(int l,int r)

int s=0x7fffffff,x1,x2;

for(auto v1:id)

for(auto v2:g[v1])

if(c[v2]==tot)

for(auto v:qid)

solve(id1,qid1);

solve(id2,qid2);

}int n,m;

int main()

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

vectorid,qid;

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

id.push_back(i);

scanf("%d",&m);

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

solve(id,qid);

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

printf("%d\n",ans[i]);

return 0;

}

訓練反思 2 (7 7)

總結反思 這次的考試有暴露出了很多問題。考試一開始,感覺心態還不錯,三道題全都過了一眼,發現只有t2 看得懂 可是沒想到這是全場考試最難的題。開始狀態良好,開始想t2。正解實在沒想出來,畢竟水平有限,推了半個多小時,只搞出來乙個錯的dp式。開始敲。發現越敲越錯。錯了又想,想了再錯,跟正解差的很多。最...

記憶體分配 北郵OJ277

在作業系統中,記憶體分配是非常重要的工作。已知記憶體空間由n個記憶體塊組成,這些記憶體塊從1到n編號,進行記憶體分配時,作業系統將選擇一塊大小足夠的記憶體全部分配給請求記憶體的程序。例如,當程序請求10mb的記憶體時,作業系統必須向該程序分配乙個不小於10mb的記憶體塊。記憶體塊不能被重複分配。作業...

AcWing 277 餅乾(線性dp)

題意 m塊餅乾,分給n個小朋友,每個小朋友至少1塊,每個小朋友有乙個數字g i 如果有x個小朋友分到的餅乾比這個小朋友多,那麼他會產生x g i 的怨氣值,你要合理分配使得所有小朋友的怨氣值之和最小,輸出最小值並輸出分配方案,如果有多種分配方案則任意輸出。思路 狀態轉移根據題意,我們知道肯定是g i...