月赛e题
  • 板块学术版
  • 楼主Imiya
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/7 17:09
  • 上次更新2023/10/27 16:36:04
查看原帖
月赛e题
455558
Imiya楼主2022/8/7 17:09
#include<iostream>
#include<cstdlib>
using namespace std;
#define int long long
inline int read(){
    int i=getchar(),r=0;
    while(i<'0'||i>'9')i=getchar();
    while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar();
    return r;
}
const int N=300100;
int ls[N],rs[N],pos[N],val[N],wei[N],siz[N];
int cnt,rt;
inline void push_up(int nd){siz[nd]=siz[ls[nd]]+siz[rs[nd]]+1;}
#define p1 first
#define p2 second
pair<int,int>split(int nd,int k){
    if(!nd)return{0,0};
    if(pos[nd]<=k){
        pair<int,int>o=split(rs[nd],k);
        rs[nd]=o.p1;push_up(nd);
        return{nd,o.p2};
    }
    else{
        pair<int,int>o=split(ls[nd],k);
        ls[nd]=o.p2;push_up(nd);
        return{o.p1,nd};
    }
}
int merge(int u,int v){
    if(!u||!v)return u|v;
    if(wei[u]<wei[v]){
        rs[u]=merge(rs[u],v);
        push_up(u);
        return u;
    }
    else{
        ls[v]=merge(u,ls[v]);
        push_up(v);
        return v;
    }
}
inline int New(int p,int k){
    pos[++cnt]=p;
    val[cnt]=k;
    wei[cnt]=rand();
    siz[cnt]=1;
    return cnt;
}
void insert(int p,int k){
    pair<int,int>o=split(rt,p);
    rt=merge(o.p1,merge(New(p,k),o.p2));
}
inline int find(int k){
    pair<int,int>o=split(rt,k);
    pair<int,int>p=split(o.p1,k-1);
    int res=p.p2;
    rt=merge(merge(p.p1,p.p2),o.p2);
    return res;
}
#undef p1
#undef p2
int ans;
signed main(){
    // freopen("read.in","r",stdin);
    int n;cin>>n;
    while(n--){
        int x=read(),y=read(),z=read();
        int p=0,h1=0,h2=0,h3=0,h4=0;
        p=find(x*1e9+y);
        if(!p)insert(x*1e9+y,0),p=find(x*1e9+y);    
        if(x>1)h1=val[find((x-1)*1e9+y)]-val[p];
        if(x<1e9)h2=val[find((x+1)*1e9+y)]-val[p];
        if(y>1)h3=val[find(x*1e9+y-1)]-val[p];
        if(y<1e9)h4=val[find(x*1e9+y+1)]-val[p];
        // cout<<h1<<' '<<h2<<' '<<h3<<' '<<h4<<' ';
        ans+=4*z;
        if(h1>0)ans-=2*min(z,h1);
        if(h2>0)ans-=2*min(z,h2);
        if(h3>0)ans-=2*min(z,h3);
        if(h4>0)ans-=2*min(z,h4);
        val[p]+=z;
        printf("%lld\n",ans);
    }
    return 0;
}

用map过的,想知道这个不到50的平衡树哪挂了qwq

2022/8/7 17:09
加载中...