description
fgd開辦了一家**公司。他雇用了n個職員,給了每個職員一部手機。每個職員的手機裡都儲存有一些同事的input**號碼。由於fgd的公司規模不斷擴大,舊的辦公樓已經顯得十分狹窄,fgd決定將公司遷至一些新的辦公樓。fg
d希望職員被安置在盡量多的辦公樓當中,這樣對於每個職員來說都會有乙個相對更好的工作環境。但是,為了聯
系方便起見,如果兩個職員被安置在兩個不同的辦公樓之內,他們必須擁有彼此的**號碼。
第一行包含兩個整數n(2<=n<=100000)和m(1<=m<=2000000)。職員被依次編號為1,2,……,n.以下m行,每sample input行包含兩個正數a和b(1<=aoutput
包含兩行。第一行包含乙個數s,表示fgd最多可以將職員安置進的辦公樓數。第二行包含s個從小到大排列的
數,每個數後面接乙個空格,表示每個辦公樓裡安排的職員數。
7 16sample output1 31 4
1 52 3
3 44 5
4 74 6
5 66 7
2 42 7
2 53 5
3 71 7
1 2 4題解
妙很容易想到建他的補圖,然後在補圖上求連通塊數量
補圖是個完全圖啊
我們可以大力dfs
當乙個點被訪問到的時候,把他從煉表裡去掉
鍊錶中存在的點相當於和當前的點有邊相連
乙個點只會出鍊錶一次
每條邊也只會被訪問一次
複雜度是n+m
n+mn+
m的
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define mp(x,y) make_pair(x,y)
using
namespace std;
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}inline
void
write
(int x)
inline
void
print
(int x)
vector<
int> mp[
110000];
int n,m;
int nxt[
110000
],pre[
110000];
inline
void
del(
int x)
int ans[
110000
],cnt;
bool v[
110000];
void
dfs(
int x)
}int
main()
for(
register
int i=
1;i<=n;i++
)sort
(mp[i]
.begin()
,mp[i]
.end()
);for(
register
int i=
1;i<=n;i++
)nxt[i]
=i+1
,pre[i]
=i-1
; nxt[0]
=1;pre[n+1]
=n;memset
(v,false
,sizeof
(v))
;for
(register
int i=
1;i<=n;i++)if
(!v[i]
) cnt++
,del
(i),
dfs(i)
;sort
(ans+
1,ans+
1+cnt)
;print
(cnt)
;for
(register
int i=
1;i<=cnt;i++
)print
(ans[i]);
puts(""
);return0;
}
BZOJ 1150 (堆 鍊錶)
你在一家 it 公司為大型寫字樓或辦公樓 offices 的計算機資料做備份。然而資料備份的工作是枯燥乏味 的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公 樓都位於同一條街上。你決定給這些辦公樓配對 兩個一組 每一對辦公樓可以通過在這兩個建築物之...
扁平化多級雙向鍊錶(利用DFS建立新的鍊錶)
題目 多級雙向鍊錶中,除了指向下乙個節點和前乙個節點指標之外,它還有乙個子鍊錶指標,可能指向單獨的雙向鍊錶。這些子列表也可能會有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。示例 1 輸入 head 1 ...
BZOJ1150 資料備份 堆 鍊錶
選出的 k kk 組一定相鄰,所以我們預處理出相鄰兩個辦公樓的間距,共 n 1 n 1 n 1 個。問題轉化為挑出 k kk 個元素,使其和盡量小且互不相鄰。假設我們選擇了其中最小的,就不能選其兩邊的 假如我們沒有選擇最小的,就一定會選擇其兩邊的,否則,將選擇的某個換成最小的會更優。建乙個鍊錶和乙個...