HDU4858 專案管理(分塊)

2022-05-28 17:03:15 字數 1080 閱讀 9236

這道題展示了分塊的強大,學到一手,雖然因為資料太過友好暴力也能過

這道題邊數多,直接遍歷複雜度很高,大佬們想到了一種分攤複雜度的方法

對於入度大於指定值例如(sqrt),這也是分塊常用指定值的點,我們定義為重點

否則為輕點,重點只和重點連,輕點和輕點連。這基於的原理是,重點的個數不超過sqrt個,並且輕點連的邊數也不超過sqrt個

對於每個點我們維護val也就是自身加的值,以及sum,周圍點的和,對於查詢,重點直接輸出sum,而輕點進行遍歷。

正確的原因是,首先輕點肯定正確,因為是暴力,對於重點來說,所有對於輕點更新的大小,都會通過輕點連向重點的邊更新到重點上

同理,重點之間也能相互傳遞,所以求出sum就是答案。而輕點不能直接輸出sum,因為對重點的更新無法傳遞到輕點,但是因為邊數控制住了

所以遍歷的複雜度依舊不高。

#include#include

#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}}

}}

view code

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.詢問跟乙個專案相鄰的專案的能量值之和。如...