洛谷P3939 數顏色

2022-05-19 10:10:51 字數 798 閱讀 6278

題目大意:有n個物品,每個物品有乙個顏色。現在有兩種操作:1.查詢l~r內有多少顏色為c的物品並輸出。2.將第x個物品和第x+1個交換。現在讓你實現這些操作。

解題思路:首先一共有300000種顏色,最多只有300000個物品,但如果直接開陣列,結果可想而知。

所以考慮用vector儲存每種顏色的編號。

並且我們保證每個vector裡的值都是公升序的。

首先考慮操作2。如果兩個相鄰的物品的位置交換,只要它們的顏色不同,則在vector中交換兩個元素時,仍然保持公升序。

那麼如果顏色相同,就不用交換了,否則需要交換兩個物品的顏色,並且在vector中也交換。

由於vector中是公升序的,所以可以用二分查詢(lower_bound)的方法找到兩個物品的迭代器,然後交換裡面的值即可。

對於操作1,很容易想到用vector右邊的指標減去左邊的指標。那麼用二分出兩個迭代器,然後相減即可。

總時間複雜度$o(m\log n)$。

c++ code:

#include#include#include#includeusing namespace std;

#define n 300005

#define vt vector::iterator

int n,m,a[n];

vectorp[n];

inline int readint()

int main()else

}return 0;

}

P3939 數顏色 動態開點線段樹

小 c 的兔子不是雪白的,而是五彩繽紛的。每只兔子都有一種顏色,不同的兔子可能有 相同的顏色。小 c 把她標號從 1 到 nn 的 nn 只兔子排成長長的一排,來給他們喂胡蘿蔔吃。排列完成後,第 ii 只兔子的顏色是 a iai 俗話說得好,蘿蔔青菜,各有所愛 小 c 發現,不同顏色的兔子可能有對胡...

NOIP2017模擬 洛谷3939 數顏色

題目背景 洛谷 mnoip 模擬賽 day1 洛谷3939 題目描述 小 c 的兔子不是雪白的,而是五彩繽紛的。每只兔子都有一種顏色,不同的兔子可能有 相同的顏色。小 c 把她標號從 1 到 nn 的 nn 只兔子排成長長的一排,來給他們喂胡蘿蔔吃。排列完成後,第 ii 只兔子的顏色是ai 俗話說得...

洛谷 P1903 數顏色 分塊 bitset

題目鏈結 給你乙個數列代表不同的顏色 可以修改 詢問一段區間內有多少種顏色。很容易想到的就是線段樹來維護bitset。這裡為了練習,使用分塊維護bitset。事實上線段樹可以看成是無限分塊。修改的時候直接暴力將被修改位置所在的塊重新計算,形成新的bitset。查詢的時候,直接按塊合併bitset即可...