BZOJ 2243 染色 線段樹 樹鏈剖分

2021-08-04 13:55:12 字數 2150 閱讀 5027

time limit: 20 sec memory limit: 512 mb

submit: 7964 solved: 2987

[submit][status][discuss]

給定一棵有n個節點的無根樹和m個操作,操作有2類:

1、將節點a到節點b路徑上所有點都染成顏色c;

2、詢問節點a到節點b路徑上的顏色段數量(連續相同顏色被認為是同一段),如「112221」由3段組成:「11」、「222」和「1」。

請你寫乙個程式依次完成這m個操作。

第一行包含2個整數n和m,分別表示節點數和運算元;

第二行包含n個正整數表示n個節點的初始顏色

下面 行每行包含兩個整數x和y,表示x和y之間有一條無向邊。

下面 行每行描述乙個操作:

「c a b c」表示這是乙個染色操作,把節點a到節點b路徑上所有點(包括a和b)都染成顏色c;

「q a b」表示這是乙個詢問操作,詢問節點a到節點b(包括a和b)路徑上的顏色段數量。

對於每個詢問操作,輸出一行答案。

6 52 2 1 2 1 1

1 21 3

2 42 5

2 6q 3 5

c 2 1 1

q 3 5

c 5 1 2

q 3 5

數n<=10^5,運算元m<=10^5,所有的顏色c為整數且在[0, 10^9]之間。

**:

#include

#include

#include

#include

using namespace std;

const

int n = 200010;

int n,m;

int a[n],co[n];

struct nodeedge[n];

int num=0,head[n];

void addedge(int

from,int to)

int fa[n],dep[n];

int siz[n],son[n];

void dfs1(int u,int f,int d)

}int indx=0;

intin[n],out[n],top[n];

void dfs2(int u,int tp)

out[u]=indx;

}struct nodet[n<<4];

void update(int root)

void build(int root,int l,int r)

int mid=l+r>>1;

build(root<<1,l,mid);

build(root<<1|1,mid+1,r);

update(root);

}void pushdown(int root)

}void modify(int root,int pos,int val,int delta)

int mid=l+r>>1;

pushdown(root);

if(pos<=mid) modify(root<<1,pos,val,delta);

if(val>mid) modify(root<<1|1,pos,val,delta);

update(root);

}void modify(int u,int v,int delta)

if(dep[u]>dep[v]) swap(u,v);

modify(1,in[u],in[v],delta);

}int lc,rc;

int query(int root,int pos,int val,int l,int r)

}int query(int u,int v)

if(dep[u]1,in[v],in[u],in[v],in[u]);

if(rc==co1) sum--;if(lc==co2) sum--;

return sum;

}#define ms(x,y) memset(x,y,sizeof(x))

int main()

dfs1(1,0,0);dfs2(1,1);

build(1,1,n);

while(m--)

else

}return

0;}

bzoj2243染色 樹鏈剖分 線段樹

time limit 20 sec memory limit 512 mb submit 8230 solved 3073 submit status discuss 給定一棵有 n個節點的無根樹和 m個操作,操作有2類 1 將節點 a到節點 b路徑上所有點都染成顏色c 2 詢問節點 a到節點 b路...

bzoj2243 染色 樹鏈剖分 線段樹

解題思路 先鏈剖。維護線段樹時每個節點維護三個值 lc 左端點顏色 rc 右端點顏色 cnt 區間中顏色段數量 注意每次合併區間時 詳見 中update,query,query函式 若左區間rc等於右區間lc是結果要減1 修改時打標記即可,注意tag初始要賦值為 1,因為有color為0的情況。in...

bzoj 2243 染色 樹鏈剖分

首先這是個挺裸的題,由於太久沒寫剖分導致調了好久,前天調了一下午,一直查不到錯 昨晚在看春晚的時候突然靈機一動,發現合併的時候出了問題,開電腦把它a掉了 感覺自己也蠻拼的給定 一棵有n 個節點的 無根樹和 m個操作 操作有 2類 1 將節點a 到節點b 路徑上所 有點都染 成顏色c 2 詢問節點a ...