W同學的新畫板 QDUOJ 線段樹 區間顏色段數

2022-03-16 22:17:28 字數 1948 閱讀 1138

原題鏈結

w同學在每天的刻苦學習完成功課之餘,都會去找一些有趣的事情來放鬆自己;恰巧今天他收到了朋友送給他的一套畫板,於是他立刻拆開了包裝,拿出其中的畫板和一些畫筆,開心地畫了起來;這時w同學注意到了閒暇的你正好待在一旁,於是他靈機一動,打算考驗一下你的眼力,具體過程是這樣的:

w同學收到的畫板可看作乙個長條狀的木板,畫板從左端到右端可劃分為等長的連續的n段(自左至右依次編號為第1段,第2段,第3段,...,第n段,如下圖所示),開始時每一段都有乙個初始的顏色,之後w同學會進行一些操作,每次操作中他都會選一段區間[l,r],然後用畫筆把畫板的第l段~第r段這一塊連續的部分染為顏色c(被染色的某段先前已存在的顏色會被新顏色覆蓋),而且每當進行一些染色操作後,w同學都有可能會讓你立即答出他給你的某段區間[l,r]中共有多少個顏色段,以此考察你的眼力,聰明的你敢不敢接受w同學的考驗?

使用線段樹來進行處理這個題是大體的思路,原因在於題目要求一段區間內的顏色段數。要注意的是,這裡是求取一段區間內的顏色的段數,不是有多少種顏色,比如 1 2 2 1 1 這個畫板就有3段顏色,和自己以前做的求取區間內的顏色的種類數不同,這個題目還沒想過,確實很新,參考的ch大佬的**,下方鏈結。

參考大佬的思路

#include#include#include#includeusing namespace std;

const int maxn=5e5+7;

struct nodenode[maxn<<2];

int col[maxn]; //儲存初始的顏色種類

void up(int rt)

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

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

build(rt<<1, l, mid);

build(rt<<1|1, mid+1, r);

up(rt);

}void down(int rt)

void update(int rt, int l, int r, int v)

int mid=(node[rt].l+node[rt].r)>>1;

if(node[rt].lazy!=-1) //這裡有點不一樣

down(rt);

if(l<=mid) update(rt<<1, l, r, v);

if(r>mid) update(rt<<1|1, l, r, v);

up(rt);

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

if(node[rt].lazy!=-1)

down(rt);

int ans=0, mid=(node[rt].l + node[rt].r)>>1;

//這裡因為交界處的特殊性,所以詢問的方式不再是if(l<=mid)……然後if(r>mid)……

//這裡需要判斷三種情況

//1.全部在左區間 2.全部在右區間 3.左右區間都有

//這裡1,2種情況比較好處理,就是第3種情況需要特殊一些

//第三種情況也是分開兩半來計算的,但是需要判斷中間交匯處是不是需要進行減一

if(r<=mid) return query(rt<<1, l, r); //第一種情況

else if(l>mid) return query(rt<<1|1, l, r); //第二種情況

else ans=query(rt<<1, l, r)+query(rt<<1|1, l, r); //第三種情況,也是比較特殊的一種情況

if(node[rt<<1].re == node[rt<<1|1].le)//這是關鍵,判斷中間交匯處的顏色是不是相等,相等需要減一

ans--;

return ans;

} int main()

else if(op==2)

}return 0;

}

網新恩普(W 筆試)

選擇題 1 一桶有黃色,綠色,紅色三種,閉上眼睛抓取同種顏色的兩個.抓取多少個就可以確定你肯定有兩個同一顏色的球?答案 4次 1 最壞打算抓3次都是不同顏色的黃 綠 紅,此時,三種顏色的球各抓了乙個,桶內沒有別的球了,在抓乙個,就會有2個球同色.2 3 1 4 次 要抓的球的數量就是顏色的種數加一....

教程0 新同學入門學習資料

沒有數字影象處理經驗的同學可以學習這個,雖然現在深度學習大行其道,但 古老 的影象處理基礎是必不可少的。劉老師本身就是中科院的大牛,這門課,講得非常好,既系統全面,又深入具有啟發性,完全不弱於國外頂級名校的公開課。沒有影象處理底子的強推一波。配套的是岡薩雷斯的那本經典教材 數字影象處理 大名鼎鼎的s...

寫給新接觸linq的同學(二)lamda從零來理解

lamda表示式讓很多新同學頭疼,很多人問我到底是啥。今天就寫個部落格給大家從零開始解釋一下。前提知識 委託 委託變數 funcfunc a,b a b 計算2 3的值 console.writeline func 2,3 console.readkey 輸出 5 其中 a,b a b 這個lamd...