題意:給一組序列,從中找出乙個四元組,使四個元素下標兩兩不同,且a<b,c<d有xa
< xb , xc > xd。問一共有多少組滿足要求的四元組。
思路:使用樹狀陣列儲存左邊小於,左邊大於,右邊小於,右邊大於當前位的數的個數。儲存逆序對,順序對組數。在逆序對x順序對的結果中存在b,c為同一數,a,d為同一數,a,c為同一數,d,b為同一數的情況,將這些情況數量減去得到答案。
1 #include2 #include3 #include4 #include5using
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那麼對於所有節點來說也是這樣的,從一開始插,...