BZOJ4765 普通計算姬(分塊 BIT)

2021-09-12 08:53:54 字數 2526 閱讀 7456

傳送門

其實很簡單

考慮修改乙個點對於所有塊的影響

我們可以預處理出乙個陣列ef[

i][j

]ef[i][j]

ef[i][

j]表示修改i

ii對第j

jj塊會影響幾個點

顯然只會影響i

ii的祖先

這個陣列可以在dfs

dfsdf

s的時候繼承父親的o(n

)o(\sqrt n)

o(n​)得到

詢問整塊直接返回

散塊相當於對於每乙個點詢問子樹和

轉成d fs

dfsdf

s序上區間求和就可以了

注意極限資料會爆lon

glon

glong\ long

longlo

ng,要開uns

igne

dlon

glon

gunsigned\ long \ long

unsign

edlo

nglo

ng

#include

using

namespace std;

inline

intread()

while

(isdigit

(ch)

)res=

(res+

(res<<2)

<<1)

+(ch^48)

,ch=

getchar()

;return res;

}#define ll unsigned long long

const

int n=

100005

;const

int m=

355;

int n,m,adj[n]

,nxt[n<<1]

,ef[n]

[m],to[n<<1]

,bel[n]

,l[m]

,r[m]

;int cnt,blo,rt,in[n]

,out[n]

,dfn;

ll sum[n]

,a[n]

,val[m]

;#define lowbit(x) (x&(-x))

struct bit

inline ll query

(int p,ll res=0)

}t;inline

void

addedge

(int u,

int v)

void

dfs(

int u,

int fa)

sum[u]

+=a[u]

,out[u]

=dfn;

}inline

void

init()

inline

void

update

(int u,ll k)

inline ll query

(int l,

int r)

for(

int i=bel[l]+1

;i<=bel[r]-1

;i++

)res+

=val[i];if

(l==l[bel[l]

])res+

=val[bel[l]];

else

for(

int i=l;i<=r[bel[l]

];i++

)res+

=t.query

(out[i]

)-t.

query

(in[i]-1

);if(r==r[bel[r]

])res+

=val[bel[r]];

else

for(

int i=l[bel[r]

];i<=r;i++

)res+

=t.query

(out[i]

)-t.

query

(in[i]-1

);return res;

}signed

main()

blo=

sqrt

(n),cnt=

(n-1

)/blo+1;

for(

int i=

1;i<=n;i++

)bel[i]

=(i-1)

/blo+1;

for(

int i=

1;i<=cnt;i++

)l[i]

=(i-1)

*blo+

1,r[i]

=min

(i*blo,n)

;dfs

(rt,0)

;init()

;for

(int i=

1;i<=m;i++)}

}

bzoj 4765 普通計算姬

求樹上一段連續編號的子樹大小的和,帶修改。分塊。預處理乙個東西g x i 表示x這個點對i這個塊的影響。然後就可以暴力搞了。對於零散的點,就用樹狀陣列維護dfs序的區間和。貌似是nn logn 的,不過就是能過。還有以後打 盡量注意,少遞迴,少遞迴,少遞迴!最後要用un sign edlo nglo...

BZOJ 4765 普通計算姬

bzoj 4765 普通計算姬 分塊 奮戰三星期,造台計算機 小g響應號召,花了三小時造了臺普通計算姬。普通計算姬比普通計算機要厲害一些 普通計算機能計算數列區間和,而普通計算姬能計算樹中子樹和。更具體地,小g的計算姬可以解決這麼個問題 給定一棵n個節點的帶權樹,節點編號為1到n,以root為根,設...

BZOJ4765 普通計算姬

bzoj4765 普通計算姬 試題描述 奮戰三星期,造台計算機 小g響應號召,花了三小時造了臺普通計算姬。普通計算姬比普通計算機要厲害一些。普通計算機能計算數列區間和,而普通計算姬能計算樹中子樹和。更具體地,小g的計算姬可以解決這麼個問題 給定一棵n個節點的帶權樹,節點編號為1到n,以root為根,...