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\) ...
随机推荐
- 【js跨域】js实现跨域访问的几种方式
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- Windows Phone 十七、Socket
Socket 常用类型 StreamSocket:Socket对象 StreamSocketListener:Socket监听对象,适用于服务端 服务端代码 <Grid x:Name=" ...
- UWP toast
Windows10的自适应和交互式toast通知是一个新特性.它可以让你: 创建灵活的toast通知,包括内嵌图片及更多的内容,不在局限于之前Windows 8.1和Windows Phone 8.1 ...
- 在Mac中保护私密文件,隐藏文件
在个人电脑中我们有些私密文件或者资料是不希望被人发现或者使用.保护私密文件的方式有很多,比如对文件进行加密,隐藏文件,修改文件后缀等.在Mac中我们也可以通过一些简单方式保护私密文件.这里我们简单介绍 ...
- 跳转 linQ
<a href="../Book/BookDetail?book_id=@book.book_id">@book.book_name</a> query + ...
- 关于UIView的显示问题
今天在倒腾PP助手SDK的接入,游戏框架使用的是cocos2d-x,因为不熟悉iOS的UIKit,所以费了点功夫终于让SDK的登录页面显示出来了,问题来了,在iOS设备landscape显示模式UI显 ...
- jquery mobile tabs
https://github.com/groovetrain/jQuery.mobile-Tabs
- CountDownLatch和CyclicBarrier 举例详解
有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结束后,才能开始.举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个 ...
- cookie 的创建 得到 删除
//设置cookie function setCookie(attr,value,time){ if(time){ var newtime=new Date(); newtime.setTime(ne ...
- android ViewPager使用遇到的问题
项目需求是需要实现一个有两页可滑动的界面,就想到了使用ViewPager,在实现是没有深入考虑,就直接使用了PagerAdapter,页面是正常实现了,可是发现无法流畅的刷新页面(直接使用notify ...