洛谷P2486 SDOI2011 染色

2021-08-14 02:44:39 字數 2085 閱讀 5096

輸入格式:

輸出格式:

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

輸入樣例#1:

6 5

2 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

輸出樣例#1:

典型的樹鏈剖分+線段樹,線段樹維護 區間左右端點顏色 和 區間顏色數。

注意:當 上傳或求顏色數 時,若 左區間右端點顏色 == 右區間左端點顏色,結果要減1 。。。

附**:

#include#include#include#define lson rt<<1

#define rson rt<<1|1

#define data(x) b[x].data

#define datal(x) b[x].left

#define datar(x) b[x].right

#define sign(x) b[x].c

#define lside(x) b[x].l

#define rside(x) b[x].r

#define maxn 100010

using namespace std;

int n,m,c=1,d=1;

int val[maxn],head[maxn],id[maxn],top[maxn],deep[maxn],son[maxn],fa[maxn],size[maxn];

struct node1a[maxn<<1];

struct node2b[maxn<<2];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void add(int u,int v)

void dfs1(int rt) }}

void dfs2(int rt,int f)

}void pushup(int rt)

void pushdown(int rt)

void buildtree(int l,int r,int rt)

mid=l+r>>1;

buildtree(l,mid,lson);

buildtree(mid+1,r,rson);

pushup(rt);

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

pushdown(rt);

mid=lside(rt)+rside(rt)>>1;

if(l<=mid)update(l,r,c,lson);

if(mid>1;

if(l<=mid)ans+=query(l,r,lson);

if(mid>1;

if(l<=mid)return qcolour(l,r,lson);

else return qcolour(l,r,rson);

}void work1(int x,int y,int z)

void work2(int x,int y)

void work()

if(ch[0]=='q')work2(x,y); }}

void init(){

int u,v;

n=read();m=read();

for(int i=1;i<=n;i++)val[i]=read();

for(int i=1;i

洛谷 P2486 SDOI2011 染色

洛谷傳送門 給定一棵 nn 個節點的無根樹,共有 mm 個操作,操作分為兩種 將節點 aa 到節點 bb 的路徑上的所有點 包括 aa 和 bb 都染成顏色 cc。詢問節點 aa 到節點 bb 的路徑上的顏色段數量。顏色段的定義是極長的連續相同顏色被認為是一段。例如112221由三段組成 11 22...

題解 P2486 SDOI2011 染色

對於剛學樹剖的同學比如我這種大大大蒟蒻來說,做這題會給你帶來很大的提公升 不僅可以對樹剖有更深刻的理解,還可以更好的理解線段樹,所以這是一道好題哦 為了更好懂,我一點一點說說思路吧 首先這題題意不難懂,只有兩個操作 區間顏色修改和區間查詢顏色數量,我們分開來看 這是這題的難點,弄懂了以後可以對線段樹...

洛谷P2484 SDOI2011 打地鼠

打地鼠是這樣的乙個遊戲 地面上有一些地鼠洞,地鼠們會不時從洞裡探出頭來很短時間後又縮回洞中。玩家的目標是在地鼠伸出頭時,用錘子砸其頭部,砸到的地鼠越多分數也就越高。遊戲中的錘子每次只能打乙隻地鼠,如果多隻地鼠同時探出頭,玩家只能通過多次揮舞錘子的方式打掉所有的地鼠。你認為這錘子太沒用了,所以你改裝了...