我們建造了乙個大專案!這個專案有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.詢問跟乙個專案相鄰的專案的能量值之和。如...