线段树点更新(好)hdu4288
2014-07-19 18:16
260 查看
Coder
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2799 Accepted Submission(s): 1117
Problem Description
In mathematics and computer science, an algorithm describes a set of procedures or instructions that define a procedure. The term has become increasing popular since the advent of cheap and reliable computers. Many companies now
employ a single coder to write an algorithm that will replace many other employees. An added benefit to the employer is that the coder will also become redundant once their work is done.
1
You are now the signle coder, and have been assigned a new task writing code, since your boss would like to replace many other employees (and you when you become redundant once your task is complete).
Your code should be able to complete a task to replace these employees who do nothing all day but eating: make the digest sum.
By saying “digest sum” we study some properties of data. For the sake of simplicity, our data is a set of integers. Your code should give response to following operations:
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 understood by
where the set S is written as {a1, a2, ... , ak} satisfying a1 < a2 < a3 < ... < ak
Can you complete this task (and be then fired)?
------------------------------------------------------------------------------
1 See http://uncyclopedia.wikia.com/wiki/Algorithm
Input
There’re several test cases.
In each test case, the first line contains one integer N ( 1 <= N <= 105 ), the number of operations to process.
Then following is n lines, each one containing one of three operations: “add x” or “del x” or “sum”.
You may assume that 1 <= x <= 109.
Please see the sample for detailed format.
For any “add x” it is guaranteed that x is not currently in the set just before this operation.
For any “del x” it is guaranteed that x must currently be in the set just before this operation.
Please process until EOF (End Of File).
Output
For each operation “sum” please print one line containing exactly one integer denoting the digest sum of the current set. Print 0 if the set is empty.
Sample Input
9 add 1 add 2 add 3 add 4 add 5 sum add 6 del 3 sum 6 add 1 add 3 add 5 add 7 add 9 sum
Sample Output
3 4 5 HintC++ maybe run faster than G++ in this problem.
自己想了半天还是没想出来。。。
思路:线段树维护下标对5取余的五种情况,cnt维护区间元素的个数。首先读入之后,排序去重,然后线段树更新
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> using namespace std; const int maxn=100010; typedef long long LL; char op[maxn][5]; int n,x[maxn],a[maxn]; struct IntervalTree { int cnt[maxn<<3]; LL sum[maxn<<3][5]; void build(int o,int l,int r) { cnt[o]=0; memset(sum[o],0,sizeof(sum[o])); if(l==r)return; int mid=(l+r)>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); } void pushup(int o) { int t=cnt[o<<1]; for(int i=0;i<5;i++)sum[o][i]=sum[o<<1][i]; for(int i=0;i<5;i++) sum[o][(i+t)%5]+=sum[o<<1|1][i]; cnt[o]=cnt[o<<1]+cnt[o<<1|1]; } void update(int o,int l,int r,int pos) { if(l==r) { cnt[o]^=1; sum[o][0]=(cnt[o]?x[pos]:0); return; } int mid=(l+r)>>1; if(pos<=mid)update(o<<1,l,mid,pos); else update(o<<1|1,mid+1,r,pos); pushup(o); } }tree; int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { int cnt=1; for(int i=1;i<=n;i++) { scanf("%s",op[i]); if(op[i][0]=='a'||op[i][0]=='d') { int tmp; scanf("%d",&tmp); a[i]=x[cnt++]=tmp; } } sort(x+1,x+cnt); int nx=unique(x+1,x+cnt)-x-1; tree.build(1,1,nx); for(int i=1;i<=n;i++) { if(op[i][0]=='s')cout<<tree.sum[1][2]<<endl; else { int pos=lower_bound(x+1,x+nx+1,a[i])-x; //cout<<a[i]<<" "<<pos<<endl; tree.update(1,1,nx,pos); } } } return 0; }
相关文章推荐
- HDU 4288 Coder 离线线段树部分更新
- hdu 4288 Coder (线段树,区间部分更新)
- HDU 4288 Coder(线段树单点更新)
- hdu 4288 Coder & CF85-D Sum of Medians (单点更新)
- HDU 1166 敌兵布阵 线段树,单点更新
- hdu 3874 线段树 单点更新,成段求和
- 【线段树延迟更新】HDU 3275
- HDU 1166 敌兵布阵 [线段树-单点更新]
- HDU 4288 Coder(12年成都 线段树)
- 【解题报告】 HDU 1754 I Hate It 线段树 单点更新
- 线段树 HDU 4217 Data Structure? 单点更新 区间查询
- HDU 1166 点更新段查询线段树
- http://acm.hdu.edu.cn/showproblem.php?pid=1779 线段树 求区间最大值 结点更新
- HDU 1754 点更新段查询最大值线段树
- HDU 1698 区间更新线段树
- hdu 1556 Color the ball (线段树,延迟更新)
- HDU 1166 敌兵布阵 线段树 点更新
- HDU 3308【线段树-query:区间最长单调上升序列,update:结点更新,区间合并】
- Hdu-1754 I hate it【线段树(单点更新)】
- 线段树单点更新 HDU 1394 Minimum Inversion Number