codeforces 85D D. Sum of Medians 线段树
2017-01-05 17:32
393 查看
D. Sum of Medians
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
In one well-known algorithm of finding the k-th order statistics we should divide all elements into groups of five consecutive elements and find the median of each five. A median is called the middle element of a sorted array (it's the third largest element for a group of five). To increase the algorithm's performance speed on a modern video card, you should be able to find a sum of medians in each five of the array.
A sum of medians of a sorted k-element set S = {a1, a2, ..., ak}, where a1 < a2 < a3 < ... < ak, will be understood by as
The
operator stands for taking the remainder, that is
stands for the remainder of dividing x by y.
To organize exercise testing quickly calculating the sum of medians for a changing set was needed.
Input
The first line contains number n (1 ≤ n ≤ 105), the number of operations performed.
Then each of n lines contains the description of one of the three operations:
add x — add the element x to the set;
del x — delete the element x from the set;
sum — find the sum of medians of the set.
For any add x operation it is true that the element x is not included in the set directly before the operation.
For any del x operation it is true that the element x is included in the set directly before the operation.
All the numbers in the input are positive integers, not exceeding 109.
Output
For each operation sum print on the single line the sum of medians of the current set. If the set is empty, print 0.
Please, do not use the %lld specificator to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams (also you may use the %I64d specificator).
Examples
Input
Output
Input
Output
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
In one well-known algorithm of finding the k-th order statistics we should divide all elements into groups of five consecutive elements and find the median of each five. A median is called the middle element of a sorted array (it's the third largest element for a group of five). To increase the algorithm's performance speed on a modern video card, you should be able to find a sum of medians in each five of the array.
A sum of medians of a sorted k-element set S = {a1, a2, ..., ak}, where a1 < a2 < a3 < ... < ak, will be understood by as
The
operator stands for taking the remainder, that is
stands for the remainder of dividing x by y.
To organize exercise testing quickly calculating the sum of medians for a changing set was needed.
Input
The first line contains number n (1 ≤ n ≤ 105), the number of operations performed.
Then each of n lines contains the description of one of the three operations:
add x — add the element x to the set;
del x — delete the element x from the set;
sum — find the sum of medians of the set.
For any add x operation it is true that the element x is not included in the set directly before the operation.
For any del x operation it is true that the element x is included in the set directly before the operation.
All the numbers in the input are positive integers, not exceeding 109.
Output
For each operation sum print on the single line the sum of medians of the current set. If the set is empty, print 0.
Please, do not use the %lld specificator to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams (also you may use the %I64d specificator).
Examples
Input
6 add 4 add 5 add 1 add 2 add 3 sum
Output
3
Input
14 add 1 add 7 add 2 add 5 sum add 6 add 8 add 9 add 3 add 4 add 10 sum del 1 sum
Output
5 11 13
#include<bits/stdc++.h> using namespace std; #define ll unsigned long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=2e5+10,M=1e6+10,inf=1e9+10; const ll INF=1e18+10,mod=2147493647; int n,tree ; int lowbit(int x) { return x&-x; } void update(int x,int c) { while(x<1e5+10) { tree[x]+=c; x+=lowbit(x); } } int getsum(int x) { int sum=0; while(x>0) { sum+=tree[x]; x-=lowbit(x); } return sum; } struct is { int lazy; ll ans[6]; }a[N<<1]; ll temp[6]; void pushup(int pos) { for(int i=0;i<5;i++) a[pos].ans[i]=a[pos<<1].ans[i]+a[pos<<1|1].ans[i]; } void change(int pos,int x) { x=(x%5+5)%5; int ji=0; for(int i=0;i<5;i++) temp[i]=a[pos].ans[i]; for(int i=x;i<5;i++) a[pos].ans[i]=temp[ji++]; for(int i=0;i<x;i++) a[pos].ans[i]=temp[ji++]; } void pushdown(int pos) { if(a[pos].lazy) { a[pos<<1].lazy+=a[pos].lazy; a[pos<<1|1].lazy+=a[pos].lazy; change(pos<<1,a[pos].lazy); change(pos<<1|1,a[pos].lazy); a[pos].lazy=0; } } void build(int l,int r,int pos) { a[pos].lazy=0; memset(a[pos].ans,0,sizeof(a[pos].ans)); if(l==r)return; int mid=(l+r)>>1; build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); } void update(int L,int R,int c,int l,int r,int pos) { if(L<=l&&r<=R) { a[pos].lazy+=c; change(pos,c); return; } pushdown(pos); int mid=(l+r)>>1; if(L<=mid) update(L,R,c,l,mid,pos<<1); if(R>mid) update(L,R,c,mid+1,r,pos<<1|1); pushup(pos); } void point(int p,int k,int c,int l,int r,int pos) { if(l==r) { a[pos].ans[k]+=c; return; } pushdown(pos); int mid=(l+r)>>1; if(p<=mid) point(p,k,c,l,mid,pos<<1); else point(p,k,c,mid+1,r,pos<<1|1); pushup(pos); } char str [5]; int b ; int s ,cnt; int getpos(int x) { int pos=lower_bound(s+1,s+1+cnt,x)-s; return pos; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",str[i]); if(str[i][0]=='a'||str[i][0]=='d') { scanf("%d",&b[i]); s[++cnt]=b[i]; } } sort(s+1,s+1+cnt); cnt=max(1,cnt); build(1,cnt,1); for(int i=1;i<=n;i++) { //cout<<str[i]<<endl; if(str[i][0]=='a') { int x=getpos(b[i]); int now=getsum(x-1); now%=5; //cout<<x<<" "<<now<<" "<<b[i]<<endl; update(x,1); update(x+1,cnt,1,1,cnt,1); point(x,now,b[i],1,cnt,1); } else if(str[i][0]=='d') { int x=getpos(b[i]); int now=getsum(x-1); now%=5; update(x,-1); point(x,now,-b[i],1,cnt,1); update(x+1,cnt,-1,1,cnt,1); } else printf("%lld\n",a[1].ans[2]); //printf("%lld\n",a[1].ans[2]); } return 0; }
相关文章推荐
- CodeForces - 668D Little Artem and Time Machine(线段树||树状数组)
- CodeForces - 558E A Simple Task——线段树 + 计数排序
- 【Codeforces-707D】Persistent Bookcase DFS + 线段树
- Codeforces - 794F - Leha and security system(线段树)
- Points - CodeForces 19 D 线段树
- Codeforces 52C - Circular RMQ - 线段树
- Codeforces 284C Cows and sequence 构造 or 线段树
- Codeforces 558E 线段树处理字符串内排序
- Codeforces 339D Xenia and Bit Operations 线段树
- Codeforces 380C - Sereja and Brackets (线段树括号匹配)
- 【线段树】[CodeForces - 717F]Heroes of Making Magic III
- codeforces 677D D. Vanya and Treasure(二维线段树)
- Codeforces 626G Raffles(贪心+线段树)
- [单调栈 线段树] Codeforces 407E Round #239 (Div. 1) E. k-d-sequence
- codeforces 85D. Sum of Medians(线段树or分块)
- [Codeforces 719 E. Sasha and Array] 矩阵快速幂+线段树
- Codeforces 622C Not Equal on a Segment(线段树)
- Codeforces 486E LIS of Sequence(线段树+LIS)
- Codeforces 672 E:Ultimate Weirdness of an Array 线段树 ★ ★ ★
- CodeForces 474F Ant colony 【线段树】【gcd】【二分】