時空限制 2000ms / 512mb
題目描述
在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。
為了簡化起見,我們把所有的蒲公英看成乙個長度為n的序列 (a_1,a_2…a_n),其中ai為乙個正整數,表示第i棵蒲公英的種類編號。
而每次詢問乙個區間 [l,r],你需要回答區間裡出現次數最多的是哪種蒲公英,如果有若干種蒲公英出現次數相同,則輸出種類編號最小的那個。
輸入格式:
第一行兩個整數 n,m ,表示有n株蒲公英,m 次詢問。
接下來一行n個空格分隔的整數 ai,表示蒲公英的種類
再接下來m 行每行兩個整數l0,r0 ,我們令上次詢問的結果為 x(如果這是第一次詢問, 則 x=0)。
令l =(
l0+x
−1)m
odn+
1,r=
(r0+
x−1)
modn
+1
l=(l_0+x-1) \bmod n + 1,r=(r_0+x-1) \bmod n + 1
l=(l0
+x−1
)mod
n+1,
r=(r
0+x
−1)m
odn+
1,如果 l>r,則交換 l,r 。
最終的詢問區間為[l,r]。
輸出格式:
輸出m 行。每行乙個整數,表示每次詢問的結果。
說明對於 100% 的資料,保證 1≤n
≤40000,1
≤m
≤50000,1
≤ai≤
10
91\le n \le 40000,1\le m \le 50000,1\le a_i \le 10^9
1≤n≤40
000,
1≤m≤
5000
0,1≤
ai≤
109題目分析
套路分塊,黑題評分十分鬼畜
s um
[i][
x]
sum[i][x]
sum[i]
[x]記錄從第i塊到序列末尾每個數出現次數,mx[i][j]記錄塊i到塊j的區間眾數
乙個[l,r]的詢問,假如其中整塊的區間為[l,r]
那麼眾數要麼出現在[l,r]中,要麼出現在[l,l)或(r,r]中
遍歷這兩部分不是整塊的部分,記錄每個數出現次數,結合sum陣列更新即可
注意數值離散化,出現次數相同更新編號小的
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long lt;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}const
int maxn=
50010
;int n,m,t;
int a[maxn]
,b[maxn]
,pos[maxn]
,cnt;
int lft[
310]
,rht[
310]
,bl[maxn]
;int sum[
310]
[maxn]
,mx[
310]
[310];
int rem[maxn]
,ans;
void
build()
}}void
cls(
int ll,
int rr)
intsolve
(int ll,
int rr)
cls(ll,rr);}
else
for(
int i=lft[q]
;i<=rr;
++i)
cls(ll,rht[p]);
cls(lft[q]
,rr);}
return res;
}int
main()
return0;
}
洛谷 P4168 Violet 蒲公英 解題報告
親愛的哥哥 你在那個城市裡面過得好嗎?我在家裡面最近很開心呢。昨天晚上奶奶給我講了那個叫 絕望 的大壞蛋的故事的說!它把人們的房子和田地搞壞,還有好多小朋友也被它殺掉了。我覺得把那麼可怕的怪物召喚出來的那個壞蛋也很壞呢。不過奶奶說他是很難受的時候才做出這樣的事的 最近村子里長出了一大片一大片的蒲公英...
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 然後預處理出對於任意兩個區間內的數字個數。也就是說,對於任...