BZOJ4241 歷史研究

2022-08-21 03:15:11 字數 1185 閱讀 4006

[傳送門]

感覺這種資訊不符合區間可加性,或者用來區間相加的時間複雜度太高的話就直接分塊。

res[i][j] 表示第 $i$ 塊到第 $j$ 塊之間的答案,查詢就先查詢整塊,再對兩端暴力。

注意不要用memset清空cnt陣列,每次使用了再迴圈一遍撤銷操作就行了。

#include #define ll long long

using

namespace

std;

namespace

io

while (ch >= '

0' && ch <= '

9')

x *=f;

}} using

namespace

io;const

int n = 1e5 + 7

;const

int block = sqrt(n) + 7

;int

n, q, a[n], v[n], tol;

intl[block], r[block], block, num, belong[n];

ll res[block][block], cnt[n], sum[block][n];

template

inline

void checkmax(t &a, t b)

void

build()

}for (int i = 1; i <= tol; i++)

cnt[i] = 0;}

bool

vis[n];

ll query(

int x, int

y) ll ans = res[p + 1][q - 1

];

if (p + 1

<= q - 1

)

for (int i = x; i <= r[p]; i++)

for (int i = l[q]; i <= y; i++)

for (int i = x; i <= r[p]; i++)

for (int i = l[q]; i <= y; i++)

return

ans;

}int

main()

return0;

}

view code

bzoj4241 歷史研究

這題也是坑了好久 之前whx帶我刷joi的時候本來應該要做的。可是太懶沒有寫。區間詢問加權眾數。分塊,預處理出塊和塊之間的答案,記錄到第i個塊數字x出現了多少次。然後查詢的時候和普通眾數基本一樣,就是乘了個權值而已。要離散化。時間複雜度o nlogn mn 昨晚寫的常數太爛了。用了struct,陣列...

BZOJ4241 歷史研究

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

bzoj4241 歷史研究

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