三元上公升子串行

2021-08-30 13:12:41 字數 753 閱讀 8127

首先,對於任意乙個選定的數aj而言

要求的是1~j-1中比aj小的數的個數

乘以j+1~n中比aj大的數的個數

求出數的個數可以直接使用樹狀陣列

最後直接統計結果就行了

但是,考慮到n的範圍很小

但是ai因此,如果不使用離散化的話,可能會炸空間

#include#include#include#includeusing namespace std;

const int maxn=3e4+10;

int n,m;

int c1[maxn],c2[maxn];

int a[maxn],_a[maxn];

int lef[maxn],rit[maxn];

inline int _q(int val)

inline int lowbit(int i)

void add(int *c,int pos,int val)

}int sum(int *c,int pos)

return res;

}int main()

sort(_a+1,_a+n+1);

m=unique(_a+1,_a+n+1)-(_a+1);

for(int i=1;i<=n;++i)

for(int i=n;i>=1;--i)

long long ans=0;

for(int i=2;icout

}

P1637 三元上公升子串行

標籤 線段樹 離散化好題。題意 給定乙個長度為 首先,我們知道求滿足 那麼對於原問題,include include include define ri register int using namespace std const int maxn 30020 int n,a maxn int l ...

P1637 三元上公升子串行

對於這個題,我們對於每乙個數i,分別求出所有比它小的,在它前面的和 比它大的,在它後面的,然後把這兩個乘起來,然後再把這些積加起來就可以了 然而這樣直接做複雜度太高了,我們要優化,仿照樹狀陣列求逆序對的方法,我們就可以在可以接受的時間內求出並且解決問題了 include include includ...

題解 P1637 三元上公升子串行

這道題我也不知道怎麼了,改著改著就ac了。然而自己看不懂自己的 但在我仔細思考後就想通了 233。不是有三個數嗎,那就吧當前列舉的數當做三個數中的第二個,先找比它小的數有幾個,再找比它大的數有幾個,分別用mi 和ma 記錄下來,最終答案就是ans mi i ma i include include ...