bzoj 4765 普通計算姬 分塊 dfs序

2021-08-09 05:40:51 字數 1892 閱讀 6384

time limit: 30 sec  

memory limit: 256 mb

submit: 1502  

solved: 322 [

submit][

status][

discuss]

"奮戰三星期,造台計算機"。小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

16109

這題的操作難點就是 記錄每乙個節點在每一塊中的影響 其他的都是模板

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

const int n = 1e5+10;

typedef unsigned long long ll;

struct node

g[n];

struct node1

p[n*2];

int head[n];

int cnt;

ll a[n], sum[n],ans[n],c[n];

void dfs(int u,int f)

g[u].r=cnt;

return ;

}int tmp[1000],ax[n][500];

int lx[n],rx[n],id[n],bx;

void dfs2(int u,int f)

tmp[id[u]]--;

return ;

}void add(int u,ll v)

return ;

}ll get(int u)

return hx;

}inline int read()while(ch<'0'||ch>'9');

dowhile(ch>='0'&&ch<='9');

return f*x;

}inline ll readll()while(ch<'0'||ch>'9');

dowhile(ch>='0'&&ch<='9');

return f*x;

}int cny;

void addx(int u,int v)

int main()

cnt=0;

dfs(root,-1);

int k=(int)sqrt(1.0*n);

int i;

for(i=1;i*k

BZOJ4765 普通計算姬(分塊 BIT)

傳送門 其實很簡單 考慮修改乙個點對於所有塊的影響 我們可以預處理出乙個陣列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 得到 詢問整塊直接返回 ...

bzoj 4765 普通計算姬

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

BZOJ 4765 普通計算姬

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