題意:求區間不同數的和。
思路:主席樹和樹狀陣列的的做法就不介紹了,blog裡有介紹過。。這裡介紹一下分塊的做法(本來是想去莽5919。。。結果沒莽過。。。只能改改**拿3333來練練手了)
這裡維護每個塊的值(最之前出現的位置)有序,之後就是分塊套路,查詢整塊的時候去二分有序陣列,就可以知道哪些是沒有計算過的了。(顯然小於l才是第一次出現)。。於是乎排序每個塊之外再加乙個每塊的字首和就好了。不多說看**。。分塊風格學的卿學姐的。感覺比以前自己寫的清爽不少,畢竟記憶體不要錢嘛(誤),總之很清爽233333
**:#includeusing namespace std;
const int maxn = 30010;
int n,q,block,num,a[maxn],belong[maxn],l[maxn],r[maxn];
pairc[maxn],d[maxn];
long long sum[maxn],q[maxn*5];
mapmp;
int in()
int build(int n){
block=sqrt(n);
num=n/block;
if(n%block!=0) num++;
for(int i=0;i
hdu3333 線段樹求不同數字之和
普通的陣列,普通的給區間求和,然而這道題要不同的數字,也就是如果有重複數字不能加入到和中 不能有重複數字那麼給線段樹中加乙個數字,如果有重複的那之前的就要刪掉 那麼查區間的時候怎麼辦呢 在新的數字v n 有效前把前n個數字和 需要查詢的 先算出來 所以先給區間們排序,每次查之前構造範圍內的線段樹 m...
HDU1754 分塊入門1
題意 單點更新,區間求最值 思路 維護每個值 and 分塊,維護每塊的最值 如果 x 和 y 隸屬於同一塊,那麼直接列舉就行 如果它們不在同一塊,那麼中間的每一塊的最大值可以由數列 p 得到,其他x,y各自所在塊包含的元素直接列舉即可 列舉塊數複雜度 sqrt n 列舉塊內元素複雜度 sqrt n ...
HDU 4389 (分塊打表)
題意 f x 表示x的各數字的和,給出 l,r 問區間中有多少個數x,存在x mod f x 0 思路 l,r範圍在1e9,估算複雜度後發現應該可以遞推打出乙個表,按1000000每塊,分塊後將塊內答案儲存在陣列中,塊間累加,塊內暴力,查詢即可。好像正解是數字dp include include i...