P3939 數顏色 動態開點線段樹

2022-05-01 13:48:09 字數 1772 閱讀 4585

小 c 的兔子不是雪白的,而是五彩繽紛的。每只兔子都有一種顏色,不同的兔子可能有 相同的顏色。小 c 把她標號從 1 到 nn 的 nn 只兔子排成長長的一排,來給他們喂胡蘿蔔吃。 排列完成後,第 ii 只兔子的顏色是 a_iai​。

俗話說得好,「蘿蔔青菜,各有所愛」。小 c 發現,不同顏色的兔子可能有對胡蘿蔔的 不同偏好。比如,銀色的兔子最喜歡吃金色的胡蘿蔔,金色的兔子更喜歡吃胡蘿蔔葉子,而 綠色的兔子卻喜歡吃酸一點的胡蘿蔔……為了滿足兔子們的要求,小 c 十分苦惱。所以,為 了使得胡蘿蔔喂得更加準確,小 c 想知道在區間 [l_j,r_j][lj​,rj​] 裡有多少只顏色為 c_jcj​的兔子。

不過,因為小 c 的兔子們都十分地活躍,它們不是很願意待在乙個固定的位置;與此同 時,小 c 也在根據她知道的資訊來給兔子們調整位置。所以,有時編號為 x_jxj​和 x_j+1xj​+1 的兩 只兔子會交換位置。 小 c 被這一系列麻煩事給難住了。你能幫幫她嗎?

從標準輸入中讀入資料。 輸入第 1 行兩個正整數 nn,mm。

輸入第 2 行 nn 個正整數,第 ii 個數表示第 ii 只兔子的顏色 a_iai​。

輸入接下來 mm 行,每行為以下兩種中的一種:

輸出到標準輸出中。

對於每個 1 操作,輸出一行乙個正整數,表示你對於這個詢問的答案。

輸入 #1複製

6 5 

1 2 3 2 3 3

1 1 3 2

1 4 6 3

2 3

1 1 3 2

1 4 6 3

輸出 #1複製

1 

2 2

3 旅遊的簡化版 水題

資料結構學傻了 其實二分就過了

//

luogu-judger-enable-o2

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ll long long

#define see(x) (cerr<

#define inf 0x3f3f3f3f

#define clr(a,v) memset(a,v,sizeof a)typedef pair

pii;

/////////////////////////////////

/const

int n=2e6+10

;int t[n<<5],ncnt,t[n<<5],lson[n<<5],rson[n<<5

],a[n];

void upnode(int x,int v,int l,int r,int&pos)

int m=(l+r)>>1

;

if(x<=m)upnode(x,v,l,m,lson[pos]);

else upnode(x,v,m+1

,r,rson[pos]);

t[pos]=t[lson[pos]]+t[rson[pos]];

}int qsum(int l,int r,int l,int r,int

pos)

intmain()

else

}return0;

}

view code

洛谷P3939 數顏色

題目大意 有n個物品,每個物品有乙個顏色。現在有兩種操作 1.查詢l r內有多少顏色為c的物品並輸出。2.將第x個物品和第x 1個交換。現在讓你實現這些操作。解題思路 首先一共有300000種顏色,最多只有300000個物品,但如果直接開陣列,結果可想而知。所以考慮用vector儲存每種顏色的編號。...

動態開點線段樹

前置芝士 眾所周知,普通線段樹空間複雜度是 o n 4 所以當n很大的時候,如果正常的去建一顆線段樹,開4倍n空間顯然會炸記憶體 怎麼辦呢?這個時候,動態開點線段樹出現了。概念 動態開點線段樹是一類特殊的線段樹,與普通的線段樹不同的是,每乙個節點的左右兒子不是該點編號的兩倍和兩倍加一,而是現加出來的...

學習筆記 動態開點線段樹

通過只開需要使用的結點以節省空間。實現過程就是把點乙個乙個往樹裡面插。建樹時遞迴進入當前結點的子結點後,若該結點為 0 即不存在,就開點。所謂開點即為把當前結點的編號設定為 tot 這樣處理下來,每個結點的編號顯然是亂序的。可以 l son 和 r son 分別記錄左右子結點的編號,然後讓它們代替普...