親愛的哥哥:
你在那個城市裡面過得好嗎?
我在家裡面最近很開心呢。昨天晚上奶奶給我講了那個叫「絕望」的大壞蛋的故事的說!它把人們的房子和田地搞壞,還有好多小朋友也被它殺掉了。我覺得把那麼可怕的怪物召喚出來的那個壞蛋也很壞呢。不過奶奶說他是很難受的時候才做出這樣的事的……
最近村子里長出了一大片一大片的蒲公英。一颳風,這些蒲公英就能飄到好遠的地方了呢。我覺得要是它們能飄到那個城市裡面,讓哥哥看看就好了呢!
哥哥你要快點回來哦!
愛你的妹妹 violet
azure 讀完這封信之後微笑了一下。
「蒲公英嗎……」
在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。
為了簡化起見,我們把所有的蒲公英看成乙個長度為n的序列 \((a_1,a_2..a_n)\),其中 \(a_i\)為乙個正整數,表示第\(i\)棵蒲公英的種類編號。
而每次詢問乙個區間\([l,r]\),你需要回答區間裡出現次數最多的是哪種蒲公英,如果有若干種蒲公英出現次數相同,則輸出種類編號最小的那個。
第一行兩個整數 \(n\),\(m\) ,表示有\(n\)株蒲公英,\(m\)次詢問。
接下來一行\(n\)個空格分隔的整數 \(a_i\),表示蒲公英的種類
再接下來\(m\)行每行兩個整數 \(l_0,r_0\),我們令上次詢問的結果為 \(x\)(如果這是第一次詢問, 則 \(x=0\))。
令 \(l=(l_0+x-1)\bmod n + 1,r=(r_0+x-1) \bmod n + 1\),如果 \(l>r\),則交換 \(l,r\) 。
最終的詢問區間為\([l,r]\)。
輸出m 行。每行乙個整數,表示每次詢問的結果。
對於 20% 的資料,保證 \(1\le n,m \le 3000\)。
對於 100% 的資料,保證 \(1\le n \le 40000,1\le m \le 50000,1\le a_i \le 10^9\)。
分塊有時候還是蠻考思維噠?
設分成大小為\(s\)塊
當詢問區間\([l.r]\)時,我們把區間拆成\([l,l)\),\([l,r]\),\((r,r]\)三個區間
其中\(l,r\)為塊的邊界
答案只可能是 \([l,r]\)的眾數以及在區間\([l,l)\)和區間\((r,r]\)出現的數字
我們對任意兩個塊所包含的大區間維護它的眾數和每個數字的出現個數
後者需要乙個長為\(n\)的陣列儲存
這樣查詢的時候,我們只需要列舉邊角的每個數字出現個數就行啦,單次複雜度\(o(s)\)
預處理的話,我們需要列舉塊的左右邊界以及數字集,複雜度\(o(n*t^2)\)
則總複雜度為\(o(ms+n*t^2)\)
考慮塊大小取多少時達到平衡
當\(ms=n*t^2\)時平衡
\(n ≈ m\)且\(s*t=n\)
所以\(s^2=n^3\)
總複雜度為\(o(n^})\)
如果用vector存+二分找似乎更快
code:
#include #include #include using namespace std;
const int n=4e4+10;
const int t=40;
int n,m,r,a[n],b[n],seg[t][t][n],num[t][t],l[t],r[t],pos[n],buct[n];
std::map ma;
int query(int l,int r)
return 0;
}
2018.8.27 洛谷P4168 Violet 蒲公英 分塊
時空限制 2000ms 512mb 題目描述 在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。為了簡化起見,我們把所有的蒲公英看成乙個長度為n的序列 a 1,a 2 a n 其中ai為乙個正整數,表示第i棵蒲公英的種類編號。而每次詢問乙個區間 l,r 你需要回答區間裡出現次數最多的是...
P4168 Violet 蒲公英 分塊
題目鏈結 分塊。p i j 表示第 i 個塊到第 j 個塊內的眾數,預處理出來就好了,列舉 i 和 j 是 o sqrt n 的,列舉 j 塊內的數也是 o sqrt n 的,總複雜度 o n sqrt n sum i h 表示前 i 個塊數字 h 出現的個數,預處理是 o n 的。對於每乙個查詢,...
洛谷P4168 蒲公英 分塊
給出乙個長度為n n的序列,m m次詢問,求區間 l,r l r 以下內容參考lyd lyd 演算法競賽高階指南 先離散化不解釋。分塊演算法一般都是以 暴力 區間預處理 暴力 的方法做的。所以,我們把n n分成t t塊,每塊長度 tn nt 然後預處理出對於任意兩個區間內的數字個數。也就是說,對於任...