輸入格式:
輸出格式:
對於每個詢問操作,輸出一行答案。
輸入樣例#1:
6 5輸出樣例#1: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 。。。
附**:
#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 打地鼠
打地鼠是這樣的乙個遊戲 地面上有一些地鼠洞,地鼠們會不時從洞裡探出頭來很短時間後又縮回洞中。玩家的目標是在地鼠伸出頭時,用錘子砸其頭部,砸到的地鼠越多分數也就越高。遊戲中的錘子每次只能打乙隻地鼠,如果多隻地鼠同時探出頭,玩家只能通過多次揮舞錘子的方式打掉所有的地鼠。你認為這錘子太沒用了,所以你改裝了...