傳送門
其實很簡單
考慮修改乙個點對於所有塊的影響
我們可以預處理出乙個陣列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為根,...