bzoj 2243 樹鏈剖分 染色

2021-07-03 02:17:00 字數 2504 閱讀 2966

time limit: 20 sec  memory limit: 512 mb

submit: 3205  solved: 1238 [

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 3

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

第一輪day1

#include #include#include#includeusing namespace std;

//siz[v]表示以v為根的子樹的節點數

//dep[v]表示v的深度(根深度為1)

//top[v]表示v所在的鏈的頂端節點

//fa[v]表示v的父親

//son[v]表示與v在同一重鏈上的v的兒子節點(姑且稱為重兒子)

const int maxn=500010;

int n;

int siz[maxn],dep[maxn],top[maxn],fa[maxn],son[maxn];

int tid[maxn];

int tim;

int col[maxn];

int rank[maxn];

struct node

e[maxn*2];

int pre[maxn],cnt;

void init()

void add(int u,int v)

//樹鏈剖分部分

void dfs1(int u,int father,int d)//求出dep,fa,siz,son

}void dfs2(int u,int tp)

}//線段樹部分

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

const int inf=1e9;

int num[4*maxn];

int lc[4*maxn];

int rc[4*maxn];

int lazy[4*maxn];

void pushup(int rt)

void pushdown(int rt)

}void build(int l,int r,int rt)

int mid=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int l,int r,int rt,int l,int r,int val)

pushdown(rt);

int mid=(l+r)>>1;

if(r<=mid)

update(lson,l,r,val);

else if(l>mid)

update(rson,l,r,val);

else

pushup(rt);

}int lc,rc;

int query(int l,int r,int rt,int l,int r)

}int solve(int x,int y,int id,int c)

else

//ans1始終跟著x跑

ans+=query(1,n,1,tid[x],tid[y]);

//注意:因為這裡弄反了wa了無數次

if(rc==ans2)

ans--;

if(lc==ans1)

ans--;

return ans;

}}int m;

int main()

{ char op[15];

//freopen("in.txt","r",stdin);

while(~scanf("%d%d",&n,&m))

{init();

for(int i=1;i<=n;i++)

scanf("%d",&col[i]);

for(int i=1;i

bzoj 2243 染色 樹鏈剖分

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

bzoj2243 樹鏈剖分 染色

description 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 請你寫乙個程式依次完成這m個操作。input 第一行包含2...

BZOJ 2243 染色 樹鏈剖分

題意 給出一棵樹,每個頂點上有個顏色 c i 有兩種操作 分析 首先樹鏈剖分,下面考慮線段樹部分 我們維護乙個區間的左端點的顏色和右斷點的顏色以及該區間的顏色段數,在加乙個顏色覆蓋標記。在pushup的時候,如果左區間右端點顏色和右區間左端點顏色相同,那麼這段顏色可以合併,合併區間的顏色段數為左右子...