hdu 4000 Fruit Ninja 樹狀數組+統計

來源:互聯網
上載者:User
/*比賽的時候沒有寫出來,賽後請教大牛後寫的可以先求出(xyz,xzy)的總數量只需出去x後面多少個比它大的個數n,C(n,2)就是瞭然後求出xyz的個數,對於a,求出比a小的個數low[a],比a大的個數high[a],low[a]*high[a]就是答案可以藉助樹狀數組求上述個數*/#include <cstdio>#include <iostream>#include <memory.h>using namespace std;const int MAX=100100;const __int64 mod=100000007;__int64 C[MAX];__int64 low[MAX];//low[a],在a前面比a小的個數__int64  high[MAX];//high[a],在a後面比a大的個數int Case;int n;int data[MAX];int low_bit(int x) {return x&(-x);}void add_up(int x) {while(x<=n) {C[x]+=1;x+=low_bit(x);}}__int64 sum(int x) {__int64 s=0;while(x) {s+=C[x];x-=low_bit(x);}return s;}void solve() {Case++;__int64 a=0, b=0;scanf("%d", &n);memset(C, 0, sizeof(C));for(int i=1;i<=n;i++) {scanf("%d", &data[i]);low[i]=sum(data[i]);high[i]=n-data[i]-i+1+low[i];add_up(data[i]);}for(int i=1;i<=n;i++) {b=((b+low[i]*high[i])%mod+mod)%mod;}for(int i=1;i<=n;i++) {a=((a+high[i]*(high[i]-1)/2)%mod+mod)%mod;}printf("Case #%d: ", Case);printf("%I64d\n", (a-b+mod)%mod);}int main () {int T;scanf("%d", &T);while(T--)solve();return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.