hdu4288 線段樹維護多個sum

2021-06-26 21:51:21 字數 1016 閱讀 3282

題意:給n個有序的數字,三個操作:1、刪除數字x;2、增加數字x;3、求i%5=3的數字之和(i為數字的下標)

思路:一開始想水一下,結果超時。先對所有輸入的數字離散化,線段樹維護區間上點的個數和5個sum值,區間合併的時候要注意:左兒子節點和父親節點的關係很容易,右兒子合併的時候與左兒子中的點個數有關。

**如下:

#include#include#include#include#include#include#define ll __int64

#define n 100005

#define inf 0x7ffffff

#define eps 1e-9

#define pi acos(-1.0)

using namespace std;

char cins[n][10];

int cinx[n];

int a[2*n];

struct node

tree[2*n*4];

void build(int o,int l,int r)

void pushup(int o)

void update(int o,int pos,int v)

int m = (tree[o].l + tree[o].r)/2;

if(pos <= m) update(2*o,pos,v);

else update(2*o+1,pos,v);

pushup(o);

}int main()

}sort(a,a+tot);

tot = unique(a,a+tot) - a;

build(1,1,tot);

for(int i = 0; i < n; i++)

{if(cins[i][0] == 's')

printf("%i64d\n",tree[1].sum[3]);

else

{int pos = lower_bound(a,a+tot,cinx[i]) - a + 1;

//cout<

hdu 4288 線段樹 離線處理

hdu 4288 題意 給你類似乙個公升序的set結構 add就是加入乙個數 del就是刪除乙個數 sum就是把所有 5 3的位置的數求和 這題我們怎麼入手呢?以前做過一道類似的樹狀陣列開55個的題 這個題其實大同小異 就是對sum陣列表示 5的值我們開個sum 5 那麼你既然是公升序的 我每次ad...

hdu 4288 Coder 成都賽區 線段樹

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

hdu4288 Coder(線段樹單點更新)

題意 支援增刪,查操作,最後的序列式遞增的。做法 主要是如何維護mod5的sum值,這裡左兒子可以不用管,關鍵是右兒子的處理,可以假設右兒子有t個節點,左兒子有cnt個節點,則令 t cnt mod 5 i 則tmod5 i cnt mod 5 mod 5 所以剩下的就是維護每個節點的節點總數以及相...