先膜卷爺。
可以去卷爺那裡看,或者看我的,注意時限是 \(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天得流感的人數。輸...