Bzoj2243 SDOI2011 染色 樹鏈剖分

2021-07-10 14:07:30 字數 1281 閱讀 7175

一眼就知道是個樹剖……

對於線段樹上每個區間,我們維護最左邊的顏色、最右邊的顏色、總顏色段數

合併區間的時候父區間的顏色段數=左右兒子的顏色段數和-左兒子最右邊的顏色是否和有兒子最左邊的顏色相等

然而我寫炸了一上午qaq

指標的線段樹等於號寫成了減號真是看不出來qaq

令人雞凍的**:

#include#include#include#include#includeusing namespace std;

const int maxn=1000000+10;

struct seg

};seg *root=new seg();

int n,m,pos[maxn],ind=0,belong[maxn];

int a[maxn],col[maxn],fa[maxn][21];

int dep[maxn],size[maxn],h[maxn],tot=1;

struct edgeg[maxn*4];

bool vis[maxn];

void push_up(seg *p)

void push_down(seg *p)

void build(seg *p,int l,int r)else if (l+1lc=new seg();

p->rc=new seg();

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

if (llc,l,mid);

else p->lc=null;

if (midrc,mid,r);

else p->rc=null;

push_up(p); }}

void add(int x,int y)

void dfs1(int x,int deep)else if (llc,l,r);

}else if (midrc,l,r);

}int getcol(seg *p,int po)

}int getans(int x,int y) sum+=ask(root,pos[y],pos[x]+1);

return sum;

}void change(seg *p,int l,int r,int colo)else

}void getchange(int x,int y,int z)change(root,pos[y],pos[x]+1,z);

}int main(){

scanf("%d%d",&n,&m);

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

for (int i=1;i

BZOJ2243 SDOI2011 染色 題解

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

BZOJ 2243 染色 動態樹

題意 一棵樹,初始時每個節點有乙個顏色。兩種操作 1 將某條路經上的點的顏色統一修改為某個值 2 統計某條路徑上顏色有多少段?比如11221算3段。思路 splay節點記錄區間的左右兩側的顏色lr,該節點的顏色val以及總的段數以及標記。向上合併時根據左孩子右孩子的lr以及當前節點的val計算當前子...

樹鏈剖分 bzoj2243

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