[傳送門]
感覺這種資訊不符合區間可加性,或者用來區間相加的時間複雜度太高的話就直接分塊。
res[i][j] 表示第 $i$ 塊到第 $j$ 塊之間的答案,查詢就先查詢整塊,再對兩端暴力。
注意不要用memset清空cnt陣列,每次使用了再迴圈一遍撤銷操作就行了。
#include #define ll long longview codeusing
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;
}
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 就是過不了嗎!不爽,蒯個題解,再見...