hdu 4288 線段樹 離線處理

2021-08-28 21:42:10 字數 1221 閱讀 7129

hdu 4288

題意 給你類似乙個公升序的set結構 add就是加入乙個數 del就是刪除乙個數 sum就是把所有%5=3的位置的數求和

這題我們怎麼入手呢?以前做過一道類似的樹狀陣列開55個的題 這個題其實大同小異 就是對sum陣列表示%5的值我們開個sum[5]

那麼你既然是公升序的 我每次add 左邊的數一定等於sum[i] 主要是右邊的數如何確定 我們知道i = x + cnt(cnt為左子樹的點個數)

那麼x = i - cnt 於是每次up操作我們爸爸的sum等於 左子樹的sum + 右子樹 (i - cnt%5 + 5) %5 

所以up就是這樣

由於數值很大 所以我們要離散化

這是我的**

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define dbg(x) ;

//cout<<#x<<" = "<< (x)<< endl

const int max_n = 1e5+6;

long long sum[max_n<<2][5];

long long a[max_n],b[max_n],num[max_n<<2];

int q[max_n];

char ch[10];

void up(int rt)

}void update(int rt,int l,int r,int x,int key)

int mid = (l+r)>>1;

if(key<=mid) update(rt<<1,l,mid,x,key);

else update(rt<<1|1,mid+1,r,x,key);

up(rt);

}int init(int m)

else if(ch[0]=='d')

else

}sort(b+1,b+1+top);

memset(num,0,sizeof(num));

memset(sum,0,sizeof(sum));

return top;

}int main()

else if(q[i]==1)

else printf("%lld\n",sum[1][3]);}}

return 0;

}

hdu4288 線段樹維護多個sum

題意 給n個有序的數字,三個操作 1 刪除數字x 2 增加數字x 3 求i 5 3的數字之和 i為數字的下標 思路 一開始想水一下,結果超時。先對所有輸入的數字離散化,線段樹維護區間上點的個數和5個sum值,區間合併的時候要注意 左兒子節點和父親節點的關係很容易,右兒子合併的時候與左兒子中的點個數有...

HDU 3333 線段樹 離線處理

hdu 3333 線段樹 離線處理 問你給定區間內的不重複的數字的和,如1 1 1 3 4 區間1到2就是1,區間1到5就是8。這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。然後如果當前點之前出...

hdu 4288 Coder 成都賽區 線段樹

題意 給出乙個有序集合,3種操作。插入乙個數,刪除乙個數,都保證序列有序。以及求和 其中求和是將下標 5 3的所有數求和 題解 線段樹 離散化 離線處理 一開始也是想的 線段樹 但是 這個和以前的 做過的 乙個線段樹 不同的 是 如果 我們 刪除 乙個 元素後 那麼 他的 下標 將會 改變 比賽是 ...