給出n個數,
求所有的i
題目也就是讓最後那個數第二大。我們輸入第i個數字a,那麼我們用的樹狀陣列存的就是sum(a-1),sum(a-1)表示在a這個位置,在前i-1個數中,有sum(a-1)個數比a小,那麼我們就可以求出在後面的(i+1,n)的序列中,有r=(n-a)-(i-1-sum(a-1))個數比a要大,(n-a)表示有這麼多個數比a大,(i-1-sum(a-1))表示前i-1個數裡面有sum(a-1)個數比a大,那麼r=(n-a)-(i-1-sum(a-1))就表示後面有多少個數比a要大。然後,我們思考一下,a當作三個數裡面的最小值,然後讓它們組合,是不是就是有c(r,2)即r*(r-1)/2,因為後面的序列都是固定的,所以並沒有排序的概念,也就是說,原本序列1 5 4 ,那麼我們沒有必要去思考1 4 5的情況,因為它已經固定好了(一開始死都想不通....),所以後面的序列選的時候直接從r個選2個就可以了,然後c(r,2)表示所有的a+兩個大的(也就是小中大,小大中都包含在裡面了),那麼我們要求的是小大中,所以對於每乙個a來說,我們都需要減去小中大的情況,那麼小中大=sum(a-1)*r,所以最後答案就是對於(1,n)所有數,求和sum(c(r,2)-sum(a-1)*r)
#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
int n;
ll c[100009];
ll lowbit(ll x)
ll getsum(ll x)
return sum;
}void update(ll x,ll val)
}int main()
printf("case #%d: %lld\n",count++,ans%100000007);
}}
hdu 4000 樹狀陣列
題意大致為 給乙個1 n的序列,求有序數對 x,y,z 其中x通過樹狀陣列可以得到a i 的後面含有的大於a i 的數的個數,假設個數為high,那麼有序數對 x,y,z 其中 x對於乙個數y,x include include using namespace std define mod 1000...
HDU 4000 樹狀陣列
題目大意 給出n個數,求 x 解題思路 題目資料量很大,暴力肯定不行的。設現在出現的位置為x,後面比它大的數有s個。s個選兩個 y,z 有s s 1 2種。此時yz無序。然後按題目要求x 1 include 2 include 3 include 4 include 5 using namespac...
HDU4000 Fruit Ninja(樹狀陣列)
嗯 這題是個標題黨 媽蛋其實大部分題目都是標題黨啊我發現。一開始不會做,即便empty大神提示說這是個樹狀陣列的題目 給empty大人丟臉了 事後empty大神狠狠得指責了我。嗯 說正事,這題得求和 求出某個數之後的,比它大的數的個數n,這樣形成的組合就是c n,2 然後再減去三個順次增大的,就得到...