一眼就知道是個樹剖……
對於線段樹上每個區間,我們維護最左邊的顏色、最右邊的顏色、總顏色段數
合併區間的時候父區間的顏色段數=左右兒子的顏色段數和-左兒子最右邊的顏色是否和有兒子最左邊的顏色相等
然而我寫炸了一上午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路徑上的顏色段數量 連續相同顏色...