faebdc的煩惱 莫隊

2022-05-20 23:00:36 字數 965 閱讀 9640

題面有點難想的莫隊。

首先我們肯定要乙個cnt[i]記錄難度i出現的次數,但是我們發現每次刪去乙個難度後,如果那個難度的個數恰好是當前最多次數,我們就可能要更新一下答案,而這取決於有多少難度的個數恰好是當前最多次數,於是我們再開乙個sum[i]記錄有多少難度的個數為i

經過上述分析容易得到莫隊更新規則:

inline void add(int x)

inline void del(int x)

另外注意一下因為範圍為\(-10^5\le a[i]\le 10^5\),所以我們可以將所有數先加上\(10^5\)

#include #include #include #define maxn 100010

#define maxq 200010

using namespace std;

int ans,cnt[100001*2],sum[100001];

int a[maxn];

inline void add(int x)

inline void del(int x)

struct nod q[maxq];

bool cmp(const nod &a, const nod &b)

int n,m,blo,res[maxq];

int main()

sort(q+1, q+1+m, cmp);

int l=1,r=1;cnt[a[1]]=1;sum[1]=1;ans=1;

for(int i=1;i<=m;++i){

while(lq[i].l) add(--l);

while(r>q[i].r) del(r--);

while(r2019.10 update 才發現這次國慶集訓day1 老師不就是faebdc嗎?!

faebdc的煩惱 st表

傳送門 題目說a i 遞增 極大降低了難度 我們將一樣的幾個點縮成乙個點 記錄l r num 表示縮的這個點對應的原區間以及長度 記錄pos 表示這個點對應縮的哪個點 然後直接對num 用st表 查詢即為 include define n 100050 using namespace std int...

莫隊總結 莫隊例題

假設我們已知區間 l,r,需要計算的區間為 l,r,由於 l 和 r分別只能單步轉移,所以需要的時間複雜度為 l l r r 相當於把兩個區間分別看成是平面上的兩個整點p1 l,r 和p2 l,r 兩點之間的轉移開銷為兩點之間的曼哈頓距離。連線所有點的最優方案為一棵樹,那麼整體的時間複雜度就是這棵樹...

莫隊講解 普通莫隊

結束了分塊,我們來講下莫隊。據我所知,莫隊能解決一切區間問題,除了翻轉。因為它就是個暴力 其實這兩者的關係並不大。僅僅是時間複雜度一樣而已。我們把原序列分成 n塊 好像就是這裡相同 這裡說的序列是查詢序列l r,並不是讀入的a i 之後我們把序列排序 按照第一關鍵字為左端點所在的塊的大小,如果相同就...