這道題我也不知道怎麼了,改著改著就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...