萌新刚学 sgt, 18 pt 求调
查看原帖
萌新刚学 sgt, 18 pt 求调
749665
huta0楼主2024/10/5 19:03
#include <iostream>
#include <vector>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 1e5+5;
    int n,a[N],b[N];
    ll ans;
    struct segment_tree {
        struct node { int l,r,sum,w; } tr[N<<2];
        #define lc(x) (x<<1)
        #define rc(x) (x<<1|1)
        void pushup(int x) { tr[x].sum=tr[lc(x)].sum+tr[rc(x)].sum; tr[x].w=tr[lc(x)].w+tr[rc(x)].w; }
        void build(int p,int l,int r) {
            tr[p]={l,r,0,0};
            if(l==r) return;
            int mid=l+r>>1;
            build(lc(p),l,mid); build(rc(p),mid+1,r);
            pushup(p);
        }
        void modify(int p,int pos,int v) {
            if(tr[p].l==tr[p].r) return void(tr[p].sum+=v);
            int mid=tr[p].l+tr[p].r>>1;
            if(pos<=mid) modify(lc(p),pos,v);
            else modify(rc(p),pos,v);
            pushup(p);
        } 
        void mf2(int p,int pos,int v) {
            if(tr[p].l==tr[p].r) return void(tr[p].w+=v);
            int mid=tr[p].l+tr[p].r>>1;
            if(pos<=mid) mf2(lc(p),pos,v);
            else mf2(rc(p),pos,v);
            pushup(p);
        }
        int qry(int p,int l,int r) {
            if(l<=tr[p].l&&tr[p].r<=r) return tr[p].sum;
            int mid=tr[p].l+tr[p].r>>1,ans=0;
            if(l<=mid) ans+=qry(lc(p),l,r);
            if(r>mid) ans+=qry(rc(p),l,r);
            return ans;
        }
        int qry2(int p,int l,int r) {
            if(l<=tr[p].l&&tr[p].r<=r) return tr[p].w;
            int mid=tr[p].l+tr[p].r>>1,ans=0;
            if(l<=mid) ans+=qry2(lc(p),l,r);
            if(r>mid) ans+=qry2(rc(p),l,r);
            return ans;
        }
    } vsgt;
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>n;
    rep(i,1,n)
        cin>>a[i];
    vsgt.build(1,1,100000);
    rep(i,1,n) {
        if(a[i]>1) b[i]=vsgt.qry(1,1,a[i]-1);
        vsgt.modify(1,a[i],1);
    }
    rep(i,1,n) vsgt.mf2(1,a[i],b[i]);
    rep(i,3,n)
        ans+=vsgt.qry2(1,1,a[i]-1);
    cout<<ans;    
    return 0;
}
2024/10/5 19:03
加载中...