P3709 大爺的字串題 莫隊 離線求眾數

2021-10-24 04:55:51 字數 1846 閱讀 7153

傳送門

比賽卡題掛機先溜了

離散化一下,讓後記錄乙個cnt陣列代表這個數出現次數,num陣列記錄出現次數為i的數有幾個。讓後直接維護就好了

#pragma gcc optimize(2)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

#define pb push_back

#define mk make_pair

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n=

1000010

,mod=

1e9+

7,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;int n,m;

int cnt[n]

,a[n]

,id[n]

,num[n]

,ans[n]

;int now;

struct node

q[n]

;vector<

int>v;

intfind

(int x)

bool

cmp(node a,node b)

void

del(

int x)

void

add(

int x)

intmain()

for(

int i=

1;i<=se;i++

)for

(int j=

(i-1

)*se+

1;j<=i*se;j++

) id[j]

=i;sort

(v.begin()

,v.end()

);v.

erase

(unique

(v.begin()

,v.end()

),v.

end())

;for

(int i=

1;i<=n;i++

) a[i]

=find

(a[i]);

for(

int i=

1;i<=m;i++

)sort

(q+1

,q+1

+m,cmp)

;int l=

1,r=0;

for(

int i=

1;i<=m;i++

)for

(int i=

1;i<=m;i++

)printf

("%d\n"

,-ans[i]);

return0;

}/**/

P3709 大爺的字串題 腦子 莫隊

簡化題意 區間眾數出現次數?為什麼?原因是,貪心的想,我們要劃分成盡量少的嚴格遞增序列,這樣rp掉的最少。設區間眾數出現次數為 x 那我們至少要分成 x 段嚴格上公升序列。include include include include include define r register int us...

P3709 大爺的字串題 莫隊 結論

p3709 大爺的字串題 有乙個顯然的結論 一段區間裡最小答案為眾數的個數 用莫隊來離線求眾數 tmp i 表示出現 i 次的數的個數,num i 表示 i 出現的次數 縮小區間 答案可能減小,看答案所在的 tmp 是否不唯一 擴大區間 答案增大 includetypedef int ll cons...

莫隊 洛谷 P3709 大爺的字串題

給你乙個字串a,每次詢問一段區間的貢獻 貢獻定義 每次從這個區間中隨機拿出乙個字元x,然後把x從這個區間中刪除,你要維護乙個集合s 如果s為空,你rp減1 如果s中有乙個元素不小於x,則你rp減1,清空s 之後將x插入s 由於你是大爺,平時做過的題考試都會考到,所以每次詢問你搞完這段區間的字元之後最...