首先,對於任意乙個選定的數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 ...