題目:傳送門
簡要題意:
給出乙個長為 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 #include8using
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 ...