這道題展示了分塊的強大,學到一手,雖然因為資料太過友好暴力也能過
這道題邊數多,直接遍歷複雜度很高,大佬們想到了一種分攤複雜度的方法
對於入度大於指定值例如(sqrt),這也是分塊常用指定值的點,我們定義為重點
否則為輕點,重點只和重點連,輕點和輕點連。這基於的原理是,重點的個數不超過sqrt個,並且輕點連的邊數也不超過sqrt個
對於每個點我們維護val也就是自身加的值,以及sum,周圍點的和,對於查詢,重點直接輸出sum,而輕點進行遍歷。
正確的原因是,首先輕點肯定正確,因為是暴力,對於重點來說,所有對於輕點更新的大小,都會通過輕點連向重點的邊更新到重點上
同理,重點之間也能相互傳遞,所以求出sum就是答案。而輕點不能直接輸出sum,因為對重點的更新無法傳遞到輕點,但是因為邊數控制住了
所以遍歷的複雜度依舊不高。
#include#includeview code#include
#include
#include
using
namespace
std;
const
int n=2e5+20
;typedef
long
long
ll;int
sum[n],val[n];
intin
[n];
intst[n];
vector
g[n];
intn,m;
struct
nodes[n];
void
init()
}int
main()
int block=sqrt(n);
for(i=1;i<=n;i++)
for(i=1;i<=m;i++)
else
}else
else}}
intq;
cin>>q;
while(q--)
else
printf(
"%d\n
",ans);}}
else}}
}}
hdu 4858專案管理 分塊
知識點 graph分塊 hdu 4858專案管理 有n 個頂點m條邊的無向圖。有 q 次操作 操作一 將所有與 u相連的頂點權值加 v 操作二 查詢頂點 u的權值。資料範圍 1 n 100000,1 m n 10,0 v 100 分塊的一道比較好的題目吶。首先,觀察題目,給定的是乙個明顯的稀疏圖。邊...
hdu 4858 專案管理 分塊
我們建造了乙個大專案!這個專案有n個節點,用很多邊連線起來,並且這個專案是連通的!兩個節點間可能有多條邊,不過一條邊的兩端必然是不同的節點。每個節點都有乙個能量值。現在我們要編寫乙個專案管理軟體,這個軟體呢有兩個操作 1.給某個專案的能量值加上乙個特定值。2.詢問跟乙個專案相鄰的專案的能量值之和。如...
HDU 4858 專案管理
我們建造了乙個大專案!這個專案有n個節點,用很多邊連線起來,並且這個專案是連通的!兩個節點間可能有多條邊,不過一條邊的兩端必然是不同的節點。每個節點都有乙個能量值。現在我們要編寫乙個專案管理軟體,這個軟體呢有兩個操作 1.給某個專案的能量值加上乙個特定值。2.詢問跟乙個專案相鄰的專案的能量值之和。如...