bzoj4241 歷史研究

2021-07-07 07:38:58 字數 1199 閱讀 8154

這題也是坑了好久》_<

之前whx帶我刷joi的時候本來應該要做的。。。可是太懶沒有寫。。。

區間詢問加權眾數。

分塊,預處理出塊和塊之間的答案,記錄到第i個塊數字x出現了多少次。然後查詢的時候和普通眾數基本一樣,就是乘了個權值而已。

要離散化。

時間複雜度o(

nlogn+

mn√)

。 昨晚寫的常數太爛了。。。用了struct,陣列開大了,狂m

然後卡了卡空間,狂re doge

然後查了很久發現有個邊界寫的有點問題

改完之後就無限tle辣qaq

電腦課花了20min來rewrite結果就a掉了smg。。。。

#include 

using

namespace

std;

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

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

#define maxn 100007

#define maxb 331

inline

int rd()

typedef

long

long ll;

inline

void upmax(ll&a , ll b)

typedef

int arr_int[maxn];

typedef ll arr_ll [maxn];

typedef

int blk_int[maxb];

typedef ll blk_ll [maxb];

int n , m , all , len , tot;

arr_int h , a , cnt , belong;

blk_ll ans[maxb];

arr_int sum[maxb] , st , ed;

void input()

void init_block()

}}void query(int l , int r)

} else

rep (i , st[r] , r)

}printf("%lld\n" , mx);

}void solve()

}int main()

BZOJ4241 歷史研究

一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過 回滾莫隊用於處理難以刪除但是易於新增 其實易於刪除難以新增也可以,但是沒見過這樣題 的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多n sqrt n,否則把左端點在一塊的一起處理,清空莫隊,然後直接令莫隊左端點在塊尾,這部分n s...

bzoj4241 歷史研究

題目鏈結 看到題目就聯想到了 bzoj2809 apio2012 dispatching。想了想權值分塊 莫隊,發現不好維護塊內最值,又看了看80s的時間,於是怒水一發線段樹 莫隊,結果先wa後tle,不斷tle,無論怎麼改常數都不行,難道nlogn sqrt n 就是過不了嗎!不爽,蒯個題解,再見...

BZOJ 4241 歷史研究

藉此學習回滾莫隊。經典的莫隊 對於區間 l r 向別的區間轉移狀態時。有時是刪除。有時是插入。同時需要維護。這類問題需要插入和刪除,以及維護比較快的情況下。才可以實現。回滾莫隊 插入和刪除是互反的操作。對於有些問題。插入和刪除好辦。維護困難。回滾莫隊可以解決 插入維護時困難,或者,刪除維護時困難的問...