三元上公升子串行 洛谷p1637

2021-08-04 13:17:16 字數 1444 閱讀 3805

erwin最近對一種叫"thair"的東西巨感興趣。。。

在含有n個整數的序列a1,a2......an中,

三個數被稱作"thair"當且僅當i求乙個序列中"thair"的個數。

輸入格式:

開始乙個正整數n,

以後n個數a1~an。

輸出格式:

"thair"的個數

輸入樣例#1:

4 50 18

3 4

6 8

1415

16 17

2125

26 input

42 1 3 4

output

2input

51 2 2 3 4

output

7對樣例2的說明:

7個"thair"分別是

1 2 3

1 2 4

1 2 3

1 2 4

1 3 4

2 3 4

2 3 4

輸出樣例#1:

約定30%的資料n<=100

60%的資料n<=2000

100%的資料n<=30000

大資料隨機生成

0<=a[i]<=maxlongint

離散化 + 樹狀陣列

1.顯然,對於所有的三元上公升子串行,我們只需要考察中間的元素,即對於每個元素,我們要求出其左邊嚴格小於它的數的個數d和右邊嚴格大於它的數的個數u,然後將u*d統計進答案即可

2.考慮如何求u和d,顯然我們需要借助一顆權值線段樹,然而這裡可以用樹狀陣列,我們只需要維護兩顆樹狀陣列,乙個正向新增數字,乙個反向新增數字,然後邊新增邊統計有多少個嚴格大於/小於它的數字即可(當然需要離散化)

#include#include#include#includeusing namespace std;

const int maxn=30005;

int a[maxn],b[maxn],c[maxn],d[maxn],tree[maxn],l[maxn],r[maxn],n;

bool cmp(int x,int y)

return res;

}int main()

sort(b+1,b+1+n,cmp);

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

else

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

memset(tree,0,sizeof(tree));

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

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

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

printf("%lld\n",ans);

return 0;

}

洛谷P1637 三元上公升子串行

p1637三元上公升子串行 提交 討論 題解 最新討論更多討論 題目描述 erwin最近對一種叫 thair 的東西巨感興趣。在含有n個整數的序列a1,a2.an中,三個數被稱作 thair 當且僅當i求乙個序列中 thair 的個數。輸入輸出格式 輸入格式 開始乙個正整數n,以後n個數a1 an。...

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...