LuoguP1637 三元上升子序列

表不喜歡離散化,因爲 美麗 醜陋,人人都會的東西,爲什麼要考呢QAQ
就是BIT
正一次反一次,相乘

#include<map>
map<int,int>ap;
#define N 30010
int bit[N<<2],a[N],b[N];
int n,f[N],g[N];
long long ans;
void add(int x)
{
    while(x<=n)
    {
        bit[x]++;
        x+=x&(-x);
    }
}
void clear()
{
    fr(i,1,n)
        bit[i]=0;
}
int query(int x)
{
    int r=0;
    while(x)
    {
        r+=bit[x];
        x-=x&(-x);
    }
    return r;
}
void getans(int *o)
{
    fr(i,1,n)
    {
        o[i]=query(a[i]);
        add(a[i]+1);
    }
}
int main()
{
    n=read();
    fr(i,1,n)
        b[i]=a[i]=read();
    sort(b+1,b+n+1);
    fr(i,1,n)
        ap[b[i]]=i;
    fr(i,1,n)
        a[i]=ap[a[i]];//就是噁心的離散化
    getans(f);//正求
    fr(i,1,n)
        b[i]=a[i];
    fr(i,1,n)
        a[i]=n-b[n-i+1]+1;//反轉
    clear();
    getans(g);//反求
    fr(i,1,n)
        ans+=f[i]*g[n+1-i];
    printf("%lld\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章