【數顏色】
墨墨購買了一套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...