題解 P1637 三元上公升子串行

2021-10-02 15:29:53 字數 1277 閱讀 3735

這道題我也不知道怎麼了,改著改著就ac了。。。。。。(然而自己看不懂自己的**)

但在我仔細思考後就想通了^ _ ^ 233。

不是有三個數嗎,那就吧當前列舉的數當做三個數中的第二個,先找比它小的數有幾個,再找比它大的數有幾個,分別用mi[ ]和ma [ ]記錄下來,

最終答案就是ans+=mi[i]*ma[i];

#include

#include

#include

#include

using

namespace std;

const

int n=

30005

;long

long map[n]

,f[n]

,n,mi[n]

,ma[n]

,ans=0;

struct node

a[n]

;bool

cmp(node x,node b)

bool

cmp2

(node x,node b)

void

add(

long

long k,

int w)

}long

long

query

(long

long k)

return sum;

}int

main()

sort

(a+1

,a+1

+n,cmp)

;//從小到大牌

for(

int i=

1;i<=n;i++

)//離散化 加 去重

for(

int i=

1;i<=n;i++

)sort

(a+1

,a+1

+n,cmp2)

;//從大到小排

memset

(f,0

,sizeof

(f))

;//初始化f陣列

for(

int i=

1;i<=n;i++

)for

(int i=n;i>=

1;i--

)for

(int i=

1;i<=n;i++

)ans+

=mi[i]

*ma[i]

;printf

("%lld"

,ans)

;}

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

erwin最近對一種叫 thair 的東西巨感興趣。在含有n個整數的序列a1,a2.an中,三個數被稱作 thair 當且僅當i求乙個序列中 thair 的個數。輸入格式 開始乙個正整數n,以後n個數a1 an。輸出格式 thair 的個數 輸入樣例 1 4 50 18 3 4 6 8 1415 1...