#9#10WA 动态开点线段树
查看原帖
#9#10WA 动态开点线段树
229373
Xeqwq楼主2022/4/28 18:04
#include <iostream>
using namespace std;
typedef long long ll;
const ll Maxn=3e4+5,Maxa=1e5+5;
ll n,a[Maxn],num=1;
struct Segt
{
    ll l,r,dat;
}t[Maxn<<7];
void build()
{
    t[1].l=0;
    t[1].r=Maxa;
}
void clear()
{
    for(ll i=1;i<(Maxn<<6);i++) t[i].dat=t[i].l=t[i].r=0;
}
void pushup(ll p)
{
    t[p].dat=t[t[p].l].dat+t[t[p].r].dat;
}
void modify(ll p,ll l,ll r,ll x)
{
    if(l==r)
    {
    	t[p].dat++;
    	return;
	}
    ll mid=(l+r)>>1;
    if(!t[p].l) t[p].l=++num;
    if(!t[p].r) t[p].r=++num;
    if(x<=mid) modify(t[p].l,l,mid,x);
    else modify(t[p].r,mid+1,r,x);
    pushup(p); 
}
ll query(ll p,ll l,ll r,ll ql,ll qr)
{
    if(ql<=l&&r<=qr) return t[p].dat;
    ll mid=(l+r)>>1,ret=0;
    if(ql<=mid&&t[p].l) ret+=query(t[p].l,l,mid,ql,qr);
    if(mid<qr&&t[p].r) ret+=query(t[p].r,mid+1,r,ql,qr);
    return ret;
}
ll bigger[Maxn],smaller[Maxn];
signed main()
{
    cin>>n;
    for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
    build();
    for(ll i=1;i<=n;i++)
    {
        modify(1,0,Maxa,a[i]);
        if(a[i]) smaller[i]=query(1,0,Maxa,0,a[i]-1);
    }
    clear(); 
    build();
    for(ll i=n;i>=1;i--)
    {
        modify(1,0,Maxa,a[i]);
        bigger[i]=query(1,0,Maxa,a[i]+1,Maxa);
    }
    ll ans=0;
    for(ll i=2;i<n;i++) ans+=bigger[i]*smaller[i];
    cout<<ans;
}
2022/4/28 18:04
加载中...