牛客練習賽41 C 抓捕盜竊犯(並查集)

2021-09-11 17:52:07 字數 730 閱讀 3845

題解:這個題中逃犯是可以連續移動的,而不是移動到乙個位置後停止,所以用並查集find函式將每個點的最開始的那個點作為父親,然後求屬於此節點的總和,最後排序找出前m大。

#include

#include

#include

#include

using namespace std;

int n,m,x;

int pre[

100010];

intfind

(int x)

int a[

100010];

long

long sum[

100010];

intmain()

for(

int i=

1;i<=n;i++

) sum[

find

(i)]

+=a[i]

;//屬於此根節點的數求和

sort

(sum+

1,sum+

1+n)

;//排序

long

long num=0;

for(

int i=n;i>n-m&&i>=

1;i--

)//注意i>=1不可少

num+

=sum[i]

; cout

}

並查集 牛客練習賽41 C抓捕盜竊犯

題目鏈結 題意,初始每乙個城市都有一夥盜賊,沒過乙個時刻盜賊就會逃竄到另乙個城市,你可以在m個城市設定監察站,會逮捕所有經過該城市的盜賊 分析 仔細分細題目,因為每個城市的盜賊都是流動的,這就可能會形成環,而如果成環的話,在環所在任一城市都可以把這批城市的全部盜賊逮捕,就不需要再環上設多個監察站了,...

牛客練習賽41E 球的體積並

題解 先判斷一下兩個球不相交以及包含的關係,比較好考慮,然後就是兩個球有交集的時候,主要就是求兩個弧面對應的高,可以設夾角,然後利用cos角的關係就是餘玄定理表示對應的高,最後就是求相交的體積,得出結果。include include include include include using na...

牛客練習賽16C 任意點 並查集

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數n表示點數 1 n 100 第二行n行,每行兩個整數xi,yi表示座標 1 xi,yi 1000 y軸正方向為北,x軸正方形為東。輸出乙個...