HDU5792 樹狀陣列

2022-09-15 03:51:07 字數 1453 閱讀 3392

題意:給一組序列,從中找出乙個四元組,使四個元素下標兩兩不同,且a<b,c<d有xa 

< xb , xc > xd。問一共有多少組滿足要求的四元組。

思路:使用樹狀陣列儲存左邊小於,左邊大於,右邊小於,右邊大於當前位的數的個數。儲存逆序對,順序對組數。在逆序對x順序對的結果中存在b,c為同一數,a,d為同一數,a,c為同一數,d,b為同一數的情況,將這些情況數量減去得到答案。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int n = 50005

;7 typedef long

long

ll;8

9int

tmp[n] , arr[n];

10int n,cnt; //

cnt為離散後不同數的個數

11int ls[n],rs[n],rb[n],lb[n]; //

ls:左邊小於當前位的數的個數 , rs:右邊小於當前位的數的個數,lb:左邊大於當前位的數的個數,rb:右邊大於當前位的數的個數

12int tls[n],trs[n],trb[n],tlb[n]; //

樹狀陣列

13 ll ans,suml,sumb; //

答案,逆序對個數,順序對個數

1415

16void

init()

1724

25 ll getl(int p,int *tr)

2633

return

res;34}

3536 ll getr(int p,int *tr)

3744

return

res;45}

4647

void upl(int p,int *tr)

4854}55

56void upr(int p,int *tr)

5763}64

6566

intmain()

6775 tmp[0] = arr[0

];76 cnt = 1;77

for (int i=1;i)

7882 sort(tmp,tmp+cnt);

83for (int i=0;i)

8490

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

9195

96 ans = suml * sumb; //

逆序對數乘順序對數,結果存在不合法的情況

97for (int i=0;i)

98102 printf("

%i64d\n

",ans);

103104

}105

return0;

106 }

hdu 5792 線段樹 離散化 思維

題目大意 given a sequence a with length n,count how many quadruple a,b,c,d satisfies a b c d 1 a n,1 cn,aa ac ad a b c d,1 aada b c d,1 aad.a b c d,1 an,1...

hdoj5792 樹狀陣列 未完待續

題意 求有多少種四個數滿足aa ab,ac ad,1 a b n 1 c d n 思路 只要找到兩種情況就成立了。在序列中對於乙個元素在他的後面存在比他大的,還有就是存在對於乙個元素在他的後面比他小的,那麼對於乙個元素的 種情況總和 種情況總和 但是這樣不難發現是有重複的。大哥說有四種可能。前面比他...

hdu 3887 樹狀陣列

給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...