LOJ 6285 數列分塊入門 9 區間眾數

2021-09-14 01:08:27 字數 1456 閱讀 5599

如果只查詢眾數的個數,完全可以莫隊,加數時容易維護眾數的數量,刪除數時,眾數的數量要麼減1,要麼不變,只需再開乙個標記陣列維護眾數的數量即可

根據陳立傑---《區間眾數解題報告》實現了下面兩種解法

解法一:

塊數分成sqrt(n)超時了,150可以過(分塊真毒瘤)

#pragma gcc optimize(2)

#include using namespace std;

const int maxn = 1e5 + 15;

int a[maxn], b[maxn], c[maxn], vis[maxn], belong[maxn], dp[1000][1000], block, n, m, l, r;

void cal(int x)

}std::vectorpos[maxn];

int find(int x, int l, int r)

int query(int l, int r)

} else

for (int i = (belong[r] - 1) * block + 1; i <= r; ++i)

}return res;

}inline int read()

inline void write(int x)

int main()

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

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

return 0;

}

優化後的解法二:

塊數調來調去,不是tle就是mle,以後有資料範圍小一點的再去試試

#pragma gcc optimize(2)

#include using namespace std;

const int maxn = 1e5+15;

const int maxn = 320;

int a[maxn],b[maxn],c[maxn],vis[maxn],belong[maxn],dp[maxn][maxn],num[maxn][maxn],dp[maxn][maxn],id[maxn][maxn],dp[maxn][maxn][maxn],block,n,m,l,r;

mapv;

void cal(int x)

int res = 0, cnt = 0;

memset(vis, 0, sizeof(vis));

for (int i = (x - 1) * block + 1; i <= n; ++i)

}int query(int l,int r)

int main()

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

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

return 0;

}

Loj 6285 數列分塊入門 9

思路 離散化處理下就好了,具體解釋在 裡 ps 小新新別看了,你學不會的 實現 includeusing namespace std const int m 1e5 10 int n,block,idx,a m bl m f 510 510 val m cnt m vector ve m void ...

loj 6285 數列分塊入門 9

題目 傳送門 簡要題意 給出乙個長為 n 的數列,以及 n 個操作,操作涉及詢問區間的最小眾數。題解 很開心,最後一題.分塊刷的非常高 惡 興 心 據說原題是一道超級大難題.還是先做做簡單的吧.首先用dp求出第i塊到第j塊的最小眾數.然後神奇的stl開始來襲.依舊分情況走一波.對於我們需要處理的其中...

LOJ6285 數列分塊入門9(分塊)

昨天對著 看了一晚上 然後今天終於在loj上過了 數列分塊入門9題撒花 然後相當玄學 塊的大小調成 sqrt 會tle,改成150就過了 嘖然後就是用map離散化之後的值不能直接比較大小 鍋鍋鍋 include include include include include include usin...