題目大意:有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即可...