BZOJ 4765 普通計算姬

2022-04-30 02:57:11 字數 1909 閱讀 2663

bzoj_4765_普通計算姬_分塊

"奮戰三星期,造台計算機"。小g響應號召,花了三小時造了臺普通計算姬。普通計算姬比普通計算機要厲害一些

。普通計算機能計算數列區間和,而普通計算姬能計算樹中子樹和。更具體地,小g的計算姬可以解決這麼個問題

:給定一棵n個節點的帶權樹,節點編號為1到n,以root為根,設sum[p]表示以點p為根的這棵子樹中所有節點的權

值和。計算姬支援下列兩種操作:

1 給定兩個整數u,v,修改點u的權值為v。

2 給定兩個整數l,r,計算sum[l]+sum[l+1]+....+sum[r-1]+sum[r]

儘管計算姬可以很快完成這個問題,可是小g並不知道它的答案是否正確,你能幫助他嗎?

第一行兩個整數n,m,表示樹的節點數與操作次數。

接下來一行n個整數,第i個整數di表示點i的初始權值。

接下來n行每行兩個整數ai,bi,表示一條樹上的邊,若ai=0則說明bi是根。

接下來m行每行三個整數,第乙個整數op表示操作型別。

若op=1則接下來兩個整數u,v表示將點u的權值修改為v。

若op=2則接下來兩個整數l,r表示詢問。

n<=10^5,m<=10^5

0<=di,v<2^31,1<=l<=r<=n,1<=u<=n

對每個操作型別2輸出一行乙個整數表示答案。

6 40 0 3 4 0 1

0 11 2

2 32 4

3 55 6

2 1 2

1 1 1

2 3 6

2 3 5

1610

9對結點編號進行分塊,樹狀陣列維護dfs序。

先預處理出來i到根路徑上經過了多少第j塊內的點,預處理時間複雜度$o(n\sqrt n)$

修改時對所有塊直接用剛才預處理出來的打標記,同時也要在樹狀陣列上修改出來。

查詢時整塊直接加上標記,零散的在樹狀陣列上暴力。

總時間複雜度$o(n\sqrt n logn)$,可過。

其實也可以對那些零散的修改$o(\sqrt n)$查詢$o(1)$,能做到$o(n\sqrt n)$不過我寫不過帶log的。

**:

#include #include #include #include using namespace std;

#define n 100050

typedef unsigned long long ll;

int size,block,l[n],r[n],pos[n],n,m;

int dep[n],fa[n],head[n],to[n<<1],nxt[n<<1],val[n],cnt,root,poi[n][350],dfn[n],son[n];

ll sum[n],tag[n],s[n],c[n];

inline void add(int u,int v)

void fix(int x,ll v)

ll inq(int x)

void dfs(int x,int y)

}son[x]=dfn[0];

}void modify(int x,int y)

ll query(int x,int y) else

for(i=l[q];i<=y;i++)

}return ans;

}int main()

}if(r[block]!=n)

for(i=1;i<=n;i++) scanf("%d",&i[val]);

for(i=1;i<=n;i++) else root=y;

}dfs(root,0);

for(i=1;i<=n;i++) s[pos[i]]+=sum[i],fix(dfn[i],val[i]);

while(m--) else

}}

bzoj 4765 普通計算姬

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

BZOJ4765 普通計算姬

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

bzoj4765 普通計算姬

給定一棵 n 個節點的帶權樹,節點編號為 1 n 以 root 為根,設 sum p 表示以點 p 為根的這棵子樹中所有節點的權值和。支援下列兩種操作 1.給定兩個整數 u,v 修改點 u 的權值為 v 2.給定兩個整數 l,r 計算 sum sum 第一行兩個整數 n,m 表示樹的節點數與操作次數...