帶修改的莫隊

2022-06-08 19:21:10 字數 1797 閱讀 5921

【數顏色】

墨墨購買了一套n支彩色畫筆(其中有些顏色可能相同),擺成一排,你需要回答墨墨的提問。墨墨會向你發布如下指令:

1、 q l r代表詢問你從第l支畫筆到第r支畫筆中共有幾種不同顏色的畫筆。

2、 r p col 把第p支畫筆替換為顏色col。

為了滿足墨墨的要求,你知道你需要幹什麼了嗎?

就是在基礎的莫隊上增加了修改操作

所以需要挪動三個指標 \(l\) , \(r\) , \(t\)

有個小技巧

while (t < qt) 

swap(a[m[t].pos], m[t].val);

}while (t > qt)

swap(a[m[t].pos], m[t].val);

t--;

}

這個 \(swap\) 操作就很靈性

塊大小為 \(^3\sqrt \) 的時候達到理論最快複雜度, 然而我 \(tle\) 了 wrnm

我這份**len = cbrt(1.0 * n * mcnt) + 1;會被卡乙個點

前兩個塊大小 \(n ^ \) 和 \(n^\) 都可以通過, 0.75跑的最快。

改成第三份理論最優就tle? 難道又是我的毒瘤**的鍋

//len = pow(n ,0.6667);

len = pow(n, 0.75);

//len = pow(n * mcnt, 0.333) + 1;

/*

* @author: zhl

* @date: 2020-11-19 10:39:02

*/#includeusing namespace std;

const int n = 150000;

int a[n], cnt[1000010], block[n];

int n, mm, len;

struct query

}q[n];

struct modify m[n];

long long qcnt, mcnt, ans[n], now;

void del(int x)

void add(int x)

signed main() ;

//q[qcnt] = ;

} else ;

} }len = pow(n ,0.6667);

for (int i = 1; i <= n; i++)block[i] = i / len;

sort(q + 1, q + 1 + qcnt);

int l = 1, r = 0, t = 0;

for (int i = 1; i <= qcnt; i++)

swap(a[m[t].pos], m[t].val);

} while (t > qt)

swap(a[m[t].pos], m[t].val);

t--;

} ans[q[i].id] = now;

} for (int i = 1; i <= qcnt; i++)printf("%d\n", ans[i]);

}

真 帶修改莫隊學習

這篇是拿來學習帶修改莫隊的。之前學過一次,但是是假的 今天來學習乙個真的帶修改莫隊 自然是分塊 塊的大小s取x2 3 x23 那麼自然地,就會有n1 3 n13 個塊 然後對於每乙個操作先按照左端點的塊排序,然後按右端點的塊排序,最後按照他上乙個修改操作是第幾個排序就可以了 別的和莫隊一樣,然後修改...

bzoj2120 2453 帶修改莫隊

待修改莫隊裸題。當莫隊有修改操作時,只要記錄每個詢問的時間,在兩次詢問之間修改就可以了。可以證明時間複雜度是o n 5 3 的 具體看 1 include2 include3 include4 include5 include6 using namespace std 7 define n 1001...

BZOJ 2120 帶修改莫隊

簡略題意 單點修改,區間查詢不同顏色個數。帶修改莫隊的板題,學習了乙個。和普通莫隊的區別在於塊的大小需要設定為n2 3,這樣可以確保複雜度為o n3 5 每次詢問之前需要把在當前時間點之前的所有修改用上,這之後的所有修改刪掉。define others ifdef poj include inclu...