20220210聯考 傳染

2022-09-20 20:00:11 字數 2692 閱讀 7394

先膜卷爺。

可以去卷爺那裡看,或者看我的,注意時限是 \(3s\)。

希爾科試圖用微光控制祖安,祖安的地圖可以視為一棵樹,根據交通的便利程度,祖安的每個小城市有乙個傳播半徑 \(r_i\),一旦微光瀰散到此城市,那麼微光也會擴散到與它距離不超過 \(r_i\) 的城市。

當然我們會給出 \(n-1\) 條路徑及其長度 \(d_i\),希爾科想知道自己最少用微光控制多少城市便可以控制整個祖安。

因為金克斯忙著炸皮城,所以這個任務就交給你了。

\(1\le n\le 3\times 10^5;0\le r_i,d_i\le 10^9.\)

我們把微光從乙個城市擴散至另乙個城市稱為感染

我們可以將問題轉化為將每個點與它能夠感染的城市連邊,然後縮點,入度為 \(0\) 的點的個數即為答案,但很可惜,這樣做時間空間都無法承受。

新技巧:點分治優化建邊

我們對點分治的關鍵點,把它子樹所有點都取出來,拷貝為兩份,乙份按照它與關鍵點的距離 \(dis\) 排序,乙份按照傳播半徑減距離 \(rdis\) 排序。

我們接下來要做的就是將 \(rdis\ge dis\) 的點進行連邊。

考慮對每乙個 \(rdis_i\) 都建乙個虛點 \(n_i\),然後將 \(n_i\) 與 \(n_\) 連邊,\(n_i\) 與它能到但 \(n_\) 不能到的點連邊,最後 \(rdis_i\) 對應的點連向 \(n_i\) 即可完成建圖優化,思路不難理解,**實現也比較簡單。

總之經過這麼神奇的優化之後,點數變為 \(n\log_2n\)級別,邊數大概是 \(3n\log_2 n\)級別

最後跑 tarjan 縮點即可。

因為有排序,所以時間複雜度 \(o(n\log_2^2n)\),當然你也可以用基排,但是沒有必要。

//12252024832524

#include #define tt templateusing namespace std;

typedef long long ll;

const int maxn = 300005;

int n,n,ans;

int r[maxn],deg[maxn*25];

ll read()

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

return x * f;

}tt void put1(t x)

tt void put(t x,char c = -1)

tt t max(t x,t y)

tt t min(t x,t y)

tt t abs(t x)

int head[maxn],head[maxn*25],tot[2];

struct edge

e[maxn<<1];

struct edge

e[maxn<<6];

void add_edge(int x,int y,int z = -1)

,head[x] = tot[0];

else e[++tot[1]] = edge,head[x] = tot[1];

}void add_double_edge(int x,int y,int z = -1)

bool vis[maxn];

int rt,siz[maxn],max[maxn];

void getrt(int x,int fa,int s)

max[x] = max(max[x],s-siz[x]);

if(!rt || max[x] < max[rt]) rt = x;

}void getsiz(int x,int fa)

}int cnt1,cnt2;

struct node

}dis[maxn],rdis[maxn];//dis & r-dis

void getdis(int x,int fa,int d)

; if(r[x] >= d) rdis[++cnt2] = node;

for(int i = head[x],v; i ;i = e[i].nxt)

if(((v = e[i].v) ^ fa) && !vis[v])

getdis(v,x,d+e[i].w);

}void solve(int x)

; rdis[cnt2 = 1] = node;

for(int i = head[x],v; i ;i = e[i].nxt)

if(!vis[v = e[i].v])

getdis(v,x,e[i].w);

sort(dis+1,dis+cnt1+1);

sort(rdis+1,rdis+cnt2+1);

int now = 1,lst = 0;

for(int i = 1;i <= cnt2;++ i) }

void dfs(int x)

}int dfn[maxn*25],low[maxn*25],s[maxn*25],tl,bl[maxn*25],dfntot,qlt;

bool ins[maxn*25];

void tarjan(int x)

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

while(v ^ x); }}

int main()

其實我有個貪心的做法, 可惜過不了大樣例,就不說了。

考試總結 2022 02 10

一種平方暴力就做法就是將每個點和它一步能覆蓋的點連邊,在新圖上找到所有沒有入度的強聯通分量 所以觀察這個做法本質上還是求沒有入度的強聯通分量,所以考慮維護乙個刪點序列,也就是在 rm dag 上後繼點比前驅點出現的位置早 被從圖上刪去的時間早 如果得到這個序列之後直接模擬感染 傳染過程,倒序掃瞄序列...

2022 02 10 連岳摘抄

23 59 如果你不能 做你所愛的 就必須 愛你所做的 我覺得這就是真理。亞歷克斯 希勒 你膽子大,不好惹,作勢打人時,連媽媽都膽寒,全中國,有這殺氣的初一生,估計是個位數。這特質可以變成大優點,也可以變成大缺點。當它變成大優點時,你將不怕挑戰,不懼困難,不畏強敵,敢闖敢拼。世上沒什麼事能擋住你,你...

6262 流感傳染

總時間限制 1000ms 記憶體限制 65536kb 描述有一批易感人群住在網格狀的宿舍區內,宿舍區為n n的矩陣,每個格點為乙個房間,房間裡可能住人,也可能空著。在第一天,有些房間裡的人得了流感,以後每天,得流感的人會使其鄰居傳染上流感,已經得病的不變 空房間不會傳染。請輸出第m天得流感的人數。輸...