hdu 4858 專案管理 分塊

2022-03-31 16:50:10 字數 1176 閱讀 7582

我們建造了乙個大專案!這個專案有n個節點,用很多邊連線起來,並且這個專案是連通的!

兩個節點間可能有多條邊,不過一條邊的兩端必然是不同的節點。

每個節點都有乙個能量值。

現在我們要編寫乙個專案管理軟體,這個軟體呢有兩個操作:

1.給某個專案的能量值加上乙個特定值。

2.詢問跟乙個專案相鄰的專案的能量值之和。(如果有多條邊就算多次,比如a和b有2條邊,那麼詢問a的時候b的權值算2次)。

第一行乙個整數t(1 <= t <= 3),表示測試資料的個數。

然後對於每個測試資料,第一行有兩個整數n(1 <= n <= 100000)和m(1 <= m <= n + 10),分別表示點數和邊數。

然後m行,每行兩個數a和b,表示a和b之間有一條邊。

然後乙個整數q。

然後q行,每行第乙個數cmd表示操作型別。如果cmd為0,那麼接下來兩個數u v表示給專案u的能量值加上v(0 <= v <= 100)。

如果cmd為1,那麼接下來乙個數u表示詢問u相鄰的專案的能量值之和。

所有點從1到n標號。

對每個詢問,輸出一行表示答案。

3 21 2

1 30 1 15

0 3 4

1 11 3

0 2 33

1 2就分塊

對於邊集小於sqrt(m)的點,我們就直接暴力去加周圍的點就好了。

對於邊集大於sqrt(m)的點,我們就只加與他相鄰的重點以及他自己

這樣我們每次查詢的時候,如果查詢的是輕點,我們就暴力掃一遍

如果查詢的是重點,就輸出目前的權值就好了

這樣均攤下來,單次詢問的複雜度是sqrt(m)的

#includeusing namespace std;

#define maxn 100050

paire[maxn];

int n,m;

vectorg[maxn];

int cnt[maxn];

int sum[maxn];

int num[maxn];

void init()

int q;scanf("%d",&q);

while(q--)

if(cmd==1)

else

printf("%d\n",sum[x]);}}

}}

hdu 4858專案管理 分塊

知識點 graph分塊 hdu 4858專案管理 有n 個頂點m條邊的無向圖。有 q 次操作 操作一 將所有與 u相連的頂點權值加 v 操作二 查詢頂點 u的權值。資料範圍 1 n 100000,1 m n 10,0 v 100 分塊的一道比較好的題目吶。首先,觀察題目,給定的是乙個明顯的稀疏圖。邊...

HDU4858 專案管理(分塊)

這道題展示了分塊的強大,學到一手,雖然因為資料太過友好暴力也能過 這道題邊數多,直接遍歷複雜度很高,大佬們想到了一種分攤複雜度的方法 對於入度大於指定值例如 sqrt 這也是分塊常用指定值的點,我們定義為重點 否則為輕點,重點只和重點連,輕點和輕點連。這基於的原理是,重點的個數不超過sqrt個,並且...

HDU 4858 專案管理

我們建造了乙個大專案!這個專案有n個節點,用很多邊連線起來,並且這個專案是連通的!兩個節點間可能有多條邊,不過一條邊的兩端必然是不同的節點。每個節點都有乙個能量值。現在我們要編寫乙個專案管理軟體,這個軟體呢有兩個操作 1.給某個專案的能量值加上乙個特定值。2.詢問跟乙個專案相鄰的專案的能量值之和。如...