codeforces 85D D. Sum of Medians 线段树
3 seconds
256 megabytes
standard input
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.
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.
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).
6
add 4
add 5
add 1
add 2
add 3
sum
3
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
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+,M=1e6+,inf=1e9+;
const ll INF=1e18+,mod=;
int n,tree[N];
int lowbit(int x)
{
return x&-x;
}
void update(int x,int c)
{
while(x<1e5+)
{
tree[x]+=c;
x+=lowbit(x);
}
}
int getsum(int x)
{
int sum=;
while(x>)
{
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
struct is
{
int lazy;
ll ans[];
}a[N<<];
ll temp[];
void pushup(int pos)
{
for(int i=;i<;i++)
a[pos].ans[i]=a[pos<<].ans[i]+a[pos<<|].ans[i];
}
void change(int pos,int x)
{
x=(x%+)%;
int ji=;
for(int i=;i<;i++)
temp[i]=a[pos].ans[i];
for(int i=x;i<;i++)
a[pos].ans[i]=temp[ji++];
for(int i=;i<x;i++)
a[pos].ans[i]=temp[ji++];
}
void pushdown(int pos)
{
if(a[pos].lazy)
{
a[pos<<].lazy+=a[pos].lazy;
a[pos<<|].lazy+=a[pos].lazy;
change(pos<<,a[pos].lazy);
change(pos<<|,a[pos].lazy);
a[pos].lazy=;
}
}
void build(int l,int r,int pos)
{
a[pos].lazy=;
memset(a[pos].ans,,sizeof(a[pos].ans));
if(l==r)return;
int mid=(l+r)>>;
build(l,mid,pos<<);
build(mid+,r,pos<<|);
}
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)>>;
if(L<=mid)
update(L,R,c,l,mid,pos<<);
if(R>mid)
update(L,R,c,mid+,r,pos<<|);
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)>>;
if(p<=mid)
point(p,k,c,l,mid,pos<<);
else
point(p,k,c,mid+,r,pos<<|);
pushup(pos);
}
char str[N][];
int b[N];
int s[N],cnt;
int getpos(int x)
{
int pos=lower_bound(s+,s++cnt,x)-s;
return pos;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",str[i]);
if(str[i][]=='a'||str[i][]=='d')
{
scanf("%d",&b[i]);
s[++cnt]=b[i];
}
}
sort(s+,s++cnt);
cnt=max(,cnt);
build(,cnt,);
for(int i=;i<=n;i++)
{
//cout<<str[i]<<endl;
if(str[i][]=='a')
{
int x=getpos(b[i]);
int now=getsum(x-);
now%=;
//cout<<x<<" "<<now<<" "<<b[i]<<endl;
update(x,);
update(x+,cnt,,,cnt,);
point(x,now,b[i],,cnt,);
}
else if(str[i][]=='d')
{
int x=getpos(b[i]);
int now=getsum(x-);
now%=;
update(x,-);
point(x,now,-b[i],,cnt,);
update(x+,cnt,-,,cnt,);
}
else
printf("%lld\n",a[].ans[]);
//printf("%lld\n",a[1].ans[2]);
}
return ;
}
codeforces 85D D. Sum of Medians 线段树的更多相关文章
- codeforces 1217E E. Sum Queries? (线段树
codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...
- Codeforces 85D Sum of Medians(线段树)
题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...
- Yandex.Algorithm 2011 Round 1 D. Sum of Medians 线段树
题目链接: Sum of Medians Time Limit:3000MSMemory Limit:262144KB 问题描述 In one well-known algorithm of find ...
- codeforces 85D D. Sum of Medians Vector的妙用
D. Sum of Medians Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/prob ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛
题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...
- Codeforces Gym 100513F F. Ilya Muromets 线段树
F. Ilya Muromets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/probl ...
- codeforces 1017C - Cloud Computing 权值线段树 差分 贪心
https://codeforces.com/problemset/problem/1070/C 题意: 有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品 现在从第一天 ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
随机推荐
- NSURLSession访问网络数据
1.NSMutableURLRequest的设置 //创建NSMutableURLRequest对象 NSMutableURLRequest *request = [NSMutableURLReque ...
- MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览
之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...
- rhel 7.0 配置centos yum源(2016/12/8),成功!
1.首先查看redhat 7.0系统本身所安装的那些yum 软件包: rpm -qa | grep yum #列出所有已安装的yum包 2.删除这些包: rpm -e *.rpm --nodeps # ...
- Hihocoder 1063 缩地
树形dp 涉及不重复背包组合求最小 从边长分段看不好入手 因为点数只有100点值<=2,总值<=200 可以对每个点的每个值进行dp 这里最后不回来肯定优于全回来 然后由于要分为回来和不回 ...
- SQLServer中用先进先出思想求成本价和平均成本单价
1.首先是创建表: create table #in ( id ,), TDate datetime not null, goodcode ) , InNum ,) null, --入库数量 Pric ...
- web后端 文件上传
需要Commons-fileupload和commons-io两个jar包.可搜索apache commons下载 jar复制在项目下的web->WEB-INF->lib下 复制在a ...
- 在活动中使用Menu
1.在res下创建menu普通文件夹,在menu下创建名为main的Menu资源文件 2.在menu组件下创建item组件:资源id,title标题名称 3.覆盖活动中的onCreateOptions ...
- redhat 更新 python 为 2.7.6
1. 下载 wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz 2. 解压,编译 tar zxvf Python-2.7.6.tgz ./ ...
- 用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)
新版用友u8.70下载地址:http://ftp.shangyuchem.com/应用软件/用友ERP-U8管理软件(8.70版).rar 准备好安装环境,因为需要SQLSERVER和IIS支持,而个 ...
- python学习笔记之类class(第六天)
参考文档: 1.金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html ...