1. 程式人生 > >Sum of Medians

Sum of Medians

又一題線段樹哦,要進行離散化處理

題目有三種操作
把位置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; }