題面有點難想的莫隊。
首先我們肯定要乙個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 之後我們把序列排序 按照第一關鍵字為左端點所在的塊的大小,如果相同就...