樹狀陣列 小奇遐想

2021-08-21 21:21:46 字數 1637 閱讀 1913

時間限制: 1 sec  記憶體限制: 128 mb

提交: 225  解決: 35

[提交] [狀態] [討論版] [命題人:admin]

題目描述

擷來一縷清風飄渺

方知今日書信未到

窗外三月天霽垂柳新長枝條

風中鳥啼猶帶歡笑

——《清風醉夢》

小奇望著青天中的悠悠白雲,開始了無限的遐想,在它的視野中,恰好有n朵高度不同的白雲排成一排,他想從左到右選出四朵白雲a,b,c,d,使得h_a輸入

第一行包括1個整數n。

第二行包括n個整數,第i個正數表示h_i,保證這n個整數是n的乙個全排列。

輸出輸出乙個整數表示答案。(mod 16777216)

樣例輸入

5

1 5 3 2 4

樣例輸出

0
提示

對於10%的資料n<=600;對於40%的資料n<=5000;

對於100%的資料n<=200000。

【分析】

用樹狀陣列求正序對的方法,求陣列pre2,pre2[i] 表示 i 處結尾的長度為2的公升序子串行種數(即正序對數量)

同理,求陣列late2,  late2[i] 表示 i 處為開頭向後,長度為2的公升序子串行數量(正序對數量)

根據late2陣列可繼續利用樹狀陣列求得陣列late3

late3[i] 表示  i 處為開頭向後,長度為3的公升序子串行數量

再來一次,倒敘迴圈,求得陣列big ,  big[i] 表示 i 處後面的大於 a[i] 的數的個數

好,現在,列舉選中的四個數的第二個數,for(int i=1;i<=n;i++)

那麼當把a[i]作為第二個數時對總答案的貢獻是 1243型種數 = 12**型種數 - 1234型種數(其中*表示大於2的數)

12**型種數 = pre2[i] * c(big[i], 2)

1234型種數 = pre2[i] * late3[i]

【**】

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int mod=16777216;

const int max=2e5+5;

ll c[202020];

void add(int k,ll num,int top)

ll read(int k)

int a[max],n;

ll late3[max];

ll pre2[max];

int main()

memset(c,0,sizeof(c));

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

memset(c,0,sizeof(c));

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

// ans = 12**-1234 (*>2)

memset(c,0,sizeof(c));

ll ans=0;

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

cout<}

小奇遐想(樹狀陣列)

擷來一縷清風飄渺 方知今日書信未到 窗外三月天霽垂柳新長枝條 風中鳥啼猶帶歡笑 清風醉夢 小奇望著青天中的悠悠白雲,開始了無限的遐想,在它的視野中,恰好有n朵高度不同的白雲排成一排,他想從左到右選出四朵白雲a,b,c,d,使得h a輸入 第一行包括1個整數n。第二行包括n個整數,第i個正數表示h i...

小奇遐想 樹狀陣列實現 容斥思想

時間限制 1 sec 記憶體限制 128 mb 提交 165 解決 21 提交 狀態 討論版 命題人 admin 題目描述 擷來一縷清風飄渺 方知今日書信未到 窗外三月天霽垂柳新長枝條 風中鳥啼猶帶歡笑 清風醉夢 小奇望著青天中的悠悠白雲,開始了無限的遐想,在它的視野中,恰好有n朵高度不同的白雲排成...

UPC5727小奇遐想 樹狀陣列 容斥

時間限制 1 sec 記憶體限制 128 mb 提交 285 解決 58 提交 狀態 討論版 命題人 admin 題目描述 擷來一縷清風飄渺 方知今日書信未到 窗外三月天霽垂柳新長枝條 風中鳥啼猶帶歡笑 清風醉夢 小奇望著青天中的悠悠白雲,開始了無限的遐想,在它的視野中,恰好有n朵高度不同的白雲排成...