AcWing249 蒲公英 分塊

2021-10-23 15:45:16 字數 2790 閱讀 8508

題意

解法分塊。首先,一段區間的眾數的候選答案一定是大塊的眾數或者小塊的每乙個數,先預處理出大塊的眾數,這樣候選答案的範圍就縮小到了 n

\sqrt n

n​個,然後每個再詢問區間內出現的次數,維護答案即可。

但是這樣做這題是無法通過所有測試點的,考慮優化查詢部分,可以預處理每個數在所有塊**現次數的字首o(n

n)

o(n \sqrt n)

o(nn​)

,差分求出現次數,可以去掉log,時間複雜度為 o(n

n)

o(n\sqrt n)

o(nn​)

。這樣比較難寫,可以嘗試玄學優化,比如修改塊的大小,把塊的大小修改為 nml

og2n

\frac}

mlog2​

n​n​

,這題也可以卡過去。

**

#pragma region

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define rep(i, a, n) for (int i = a; i <= n; ++i)

#define per(i, a, n) for (int i = n; i >= a; --i)

namespace fastio

inline

charnc(

)}return

*p1++;}

inline

bool

blank

(char ch)

template

<

class

t>

inline

bool

r(t &x)

inline

boolr(

double

&x)if

(sign)

x =-x;return

true;}

inline

boolr(

char

*s)inline

boolr(

char

&c)return

true;}

template

<

classt,

class..

. u>

bool

r(t &h, u &..

. tmp)

#undef out_size

#undef buf_size};

// namespace fastio

using

namespace fastio;

template

<

class

t>

void_w(

const t &x)

void_w(

const

int&x)

void_w(

const

int64_t

&x)void_w(

const

double

&x)void_w(

const

char

&x)void_w(

const

char

*x)template

<

classt,

class

u>

void_w(

const pair

&x)template

<

class

t>

void_w(

const vector

&x)voidw(

)template

<

classt,

class..

. u>

voidw(

const t &head,

const u &..

. tail)

#pragma endregion

//const

int maxn =

1e5+5;

const

int maxb =

1005

;int n, q, b, a[maxn]

, b[maxn]

;int cnt[maxn]

, ans[maxb]

[maxb]

;//候選答案

vector<

int> pos[maxn]

;inline

intgetcnt

(const

int&l,

const

int&r,

const

int&x)

intquery

(int l,

int r)

}else

rep(i, idr * b, r)

}return b[num];}

intmain()

for(

int l = b; l <= n; l +

= b)

}int last =0;

while

(q--

)}

acwing249 蒲公英 分塊

題目鏈結 題目意思很簡單,給出乙個長度為n的陣列 m個查詢 每個查詢有 l r 查詢的是區間裡的眾數,如果數量相等輸出小的那個。這可怎麼做,剛開始看到這道題 懵了一會 想不到怎麼做 線段樹沒辦法維護或者是我不會維護 感覺 咋咋都不行 於是看了看書上的題解,看不懂啊 只看懂了要用分塊 於是就自己想著用...

蒲公英 分塊

在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。為了簡化起見,我們把所有的蒲公英看成乙個長度為 n 的序列a1,a2,an,其中ai為乙個正整數,表示第 i 棵蒲公英的種類編號。而每次詢問乙個區間 l,r 你需要回答區間裡出現次數最多的是哪種蒲公英,如果有若干種蒲公英出現次數相同,則...

分塊 蒲公英

include include include include define maxn 40005 using namespace std int rd return x partition section int a maxn blk maxn sizb int tmplwb maxn 離散化的輔...