loj 6285 數列分塊入門 9

2022-07-31 20:54:09 字數 1223 閱讀 8381

題目:傳送門

簡要題意:

給出乙個長為 n 的數列,以及 n 個操作,操作涉及詢問區間的最小眾數。

題解:很開心,最後一題...分塊刷的非常高(惡)興(心)!

據說原題是一道超級大難題...還是先做做簡單的吧...

首先用dp求出第i塊到第j塊的最小眾數...

然後神奇的stl開始來襲...

依舊分情況走一波...

對於我們需要處理的其中一段小區間,那麼可以用乙個vector將不同種類的數所出現的位置先存起來,那麼就可以用upper_bound右端點-lower_bound左端點...(具體的就看**吧)

大槽點:對於不會用stl的蒟蒻...以為upper_bound如果找不到答案就會返回最後乙個位置...自信的認為hzwer的**是錯的...結果...手測一波,發現返回的是末尾指標加1???好的hzwer大佬我錯了orz

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9int n,id,a[110000],ba[110000],cnt[51000

];10

int block,pos[110000

];11

int f[510][510];//

第i塊到第j塊的最小眾數是第幾種數

12 mapmp;

13 vectorw[51000

];14

void dp(int

x)1524}

25int getlong(int l,int r,int

x)26

30int sol(int l,int

r)31

40if(pos[l]!=pos[r])

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

4246

return

ans;47}

48int

main()

4961 a[i]=mp[a[i]];

62w[a[i]].push_back(i);63}

64for(int i=1;i<=pos[n];i++)dp(i);

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

6672

return0;

73 }

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 ...

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

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

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

如果只查詢眾數的個數,完全可以莫隊,加數時容易維護眾數的數量,刪除數時,眾數的數量要麼減1,要麼不變,只需再開乙個標記陣列維護眾數的數量即可 根據陳立傑 區間眾數解題報告 實現了下面兩種解法 解法一 塊數分成sqrt n 超時了,150可以過 分塊真毒瘤 pragma gcc optimize 2 ...