題意:支援增刪,查操作,最後的序列式遞增的。
做法:主要是如何維護mod5的sum值,這裡左兒子可以不用管,關鍵是右兒子的處理,可以假設右兒子有t個節點,左兒子有cnt個節點,
則令(t+cnt)mod 5= i 則tmod5=(i-cnt mod 5)mod 5 ,所以剩下的就是維護每個節點的節點總數以及相應的和就好了。
1#include
2 #include
3 #include
4 typedef long
long ll;
5using
namespace std;
6#define lz u<<1,l,mid
7#define rz u<<1|1,mid+1,r
8const
int max = 100000+10;
9struct node
10 tree[max<<2];
13int num[max],rnum[max],check[max];
14void build(int u,int l,int r)
15 23 }
24void add(int u,int l,int r,int x,int d,int cur)
25 32
int mid=(l+r)>>1;
33if(x<=mid) add(lz,x,d,cur);
34else add(rz,x,d,cur);
35 tree[u].cnt=tree[u<<1].cnt+tree[u<<1|1].cnt;
36for(int i=0;i<5;i++)
37
40 }
41int main()
42 56
else
if(str[0]=='d')
57
61else check[i]=3;
62 }
63 sort(rnum,rnum+cur);
64int tot=unique(rnum,rnum+cur)-rnum;
65if(tot!=0) build(1,1,tot);
66for(int i=0;i67
73else
if(check[i]==2)
74
78else
79
85 }
86 }
87 }
88return
0;89 }
hdu 4288 Coder 成都賽區 線段樹
題意 給出乙個有序集合,3種操作。插入乙個數,刪除乙個數,都保證序列有序。以及求和 其中求和是將下標 5 3的所有數求和 題解 線段樹 離散化 離線處理 一開始也是想的 線段樹 但是 這個和以前的 做過的 乙個線段樹 不同的 是 如果 我們 刪除 乙個 元素後 那麼 他的 下標 將會 改變 比賽是 ...
hdu 4288 Coder(單點操作,查詢)
題意 三種操作 1.add x add the element x to the set 2.del x remove the element x from the set 3.sum find the digest sum of the set.the digest sum should be u...
無聊題目大紀實(HDU 4288 Coder)
這神題,暴力陣列可過,vector可過,線段樹可過。時限拉的太長了,所以就成水題了。不過比賽的時候真的沒敢用陣列暴力寫。說說線段樹的思路吧。對樹的每個節點 l,r,cnt,sum 5 分別表示左區間,右區間,這段區間上的點數,這段區間上sum x 5 的和。先把所有的資料都讀入,然後離散化,去掉重複...