\(\text\)
\(\text\)
借用的內容
一般的區間問題都可以使用莫隊。
這是離線莫隊的裸的板子(真的就這麼短的四句話只是add和del裡面要加內容。。)
至於塊的大小在這兒
對於複雜度的分析
\(\text\)
\(\sum_^ x_i * \sqrt + n * \sqrt\) = \(o(n\sqrt)\)
\(\text\)
由此可以推出 莫隊的複雜度大概就是乙個 \(\theta(n \sqrt)\)
莫隊**都很短的 只要別把l++
寫成++l
例題整理
小z的襪子
小z的襪子(雙倍經驗)
帶修改的莫隊
離散化樹上莫隊
bzoj4866
bzoj3809 還有在衢州欠下的題(小聲
莫隊的板子:
例題先鴿 明天再更
這題好像就是個結論題
數學計算方法為
對於乙個區間的計算我們設\(i\)的個數為\(s_i\)
那麼答案就是
$\sum_^ - (r - l + 1) \(
\)-------------------\(
\) $
**
#include using namespace std ;
#define int long long
inline int read()
struct node ;
// #define int long long
struct answer
inline void solve()
else
printf("%lld/%lld\n" , x , y) ;
return ;
}};const static int n = 100000 + 5 ;
int n ;
int a[n] ;
node q[n] ;
int bl[n] ;
answer ans[n] ;
inline bool cmp(node x , node y)
int ans = 0 ;
int s[n] ;
inline void delete(int x)
inline void insert(int x)
signed main() ;
}sort(q + 1 , q + m + 1 , cmp) ;
int l = 1 , r = 0 ;
int ans_x = 0 ;
int ans_y = 0 ;
for(register int i = 1 ; i <= m ; i ++) ;
continue ;
}ans_x = ans - (q[i].r - q[i].l + 1) ;
ans_y = (q[i].r - q[i].l + 1) * (q[i].r - q[i].l) ;
ans[q[i].id] = ;
}for(register int i = 1 ; i <= m ; i ++)
return 0 ;
}
莫隊學習筆記
zl 姐姐有一串數,由於學生化太頭禿了,所以現在他想問你 m m 1e5 次,其中 l 到 r 區間出現次數在 3 次及以上的數有多少個?線段樹效率低下,不好維護。p.s.lmpp 巨佬說如果 3 次可以取等的話,線段樹反而效率更高,巨佬們可以自己嘗試,菜比這裡就不演示了 故引入莫隊 一種處理區間問...
學習筆記 莫隊
題意簡述 給定乙個長度為 n 的序列,每次給定乙個區間 l,r 求 r l 1 count 1 times count 2 times times count n 先預處理出階乘和階乘的乘法逆元,然後每次更新除掉原來的數乘上後來的數就好了 code below include include inc...
學習筆記 樹上莫隊
其實樹上莫隊是乙個尤拉序而已嘛,像普通的莫隊,特判一下出現過兩次的值就行了 設 st i 為 i 進棧的時間,ed i 為 i 出棧的時間,dfn x,那麼就可以分兩種情況 1 y 在 x 子樹中,也就是 lca x,y x 那麼區間轉化成 st x,st y 2 y 不在 x 子樹中,也就是 lc...