Sum of Medians
阿新 • • 發佈:2019-02-09
又一題線段樹哦,要進行離散化處理
題目有三種操作
把位置x填上
把位置x的數去掉
詢問當前序列中存在的數,位置按照順序%5之後餘3的數的和。。。
哇。。。感覺我沒說清楚題意
不過看程式碼吧,給程式碼加了個小寵物,23333~
/*********************
welcome to view my codes
┏┛┻━━━┛┻┓
┃|||||||┃
┃ ━ ┃
┃ ┳┛ ┗┳ ┃
┃ ┃
┃ ┻ ┃
┃ ┃
┗━┓ ┏━┛
┃ 史 ┃
┃ 詩 ┃
┃ 之 ┃
┃ 寵 ┃
┃ ┗━━━┓
┃AC 與我同在 ┣┓
┃做題專用寵物 ┃
┗┓┓┏━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛
**********************/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <bitset>
#include <map>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define mem(i,a) memset(i,a,sizeof(i))
#define rson mid+1,r,rt<<1|1
#define lson l,mid,rt<<1
#define mp make_pair
#define pb push_back
#define ll long long
#define LL long long
using namespace std;
template <typename T>inline void read(T &_x_){
_x_=0;bool f=false;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();}
while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();}
if(f) _x_=-_x_;
}
const double eps = 0.0000001;
const int maxn = 2e5+7;
const int mod = 1e9+7;
struct op{
char ch[5];
int num;
}v[maxn];
int n,d[maxn],cnt=0,tot=0;
ll sum[maxn<<2],mo[maxn<<2][5];
void pushup(int rt){
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
for(int i=0;i<5;i++){
int k = (sum[rt<<1]+i)%5;
mo[rt][k] = mo[rt<<1][k] + mo[rt<<1|1][i];
}
}
void update(int l,int r,int rt,int p,int val){
if(l==r){
sum[rt]+=val;
if(val>0) mo[rt][1]=d[p];
else mo[rt][1]=0;
return;
}
int mid=(l+r)/2;
if(mid>p) update(lson,p,val);
else update(rson,p,val);
pushup(rt);
}
int main(){
read(n);
FOR(i,1,n){
scanf("%s",v[i].ch);
if(v[i].ch[0]=='a'){
scanf("%d",&v[i].num);
d[tot++]=v[i].num;
}else if(v[i].ch[0]=='d'){
scanf("%d",&v[i].num);
d[tot++]=v[i].num;
}else{
v[i].num=cnt++;
}
}
sort(d,d+tot);
int pos = unique(d,d+tot)-d;
FOR(i,1,n){
if(v[i].ch[0]=='a'){
int p = lower_bound(d,d+pos,v[i].num)-d;
update(1,pos+1,1,p,1);
}else if(v[i].ch[0]=='d'){
int p = lower_bound(d,d+pos,v[i].num)-d;
update(1,pos+1,1,p,-1);
}else{
printf("%I64d\n",mo[1][3]);
}
}
return 0;
}