1. 程式人生 > >牛客練習賽7 E 珂朵莉的數列(樹狀數組+爆long long解決方法)

牛客練習賽7 E 珂朵莉的數列(樹狀數組+爆long long解決方法)

src main stdin scanf return n) can print con

https://www.nowcoder.com/acm/contest/38/E

題意:

技術分享圖片

思路:

樹狀數組維護。從大佬那裏學習了如何處理爆long long的方法。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn = 1000000+100;
 8 
 9 int n;
10 int
a[maxn],b[maxn]; 11 ll c[maxn]; 12 13 int lowbit(int x) 14 { 15 return x&(-x); 16 } 17 18 void add(int x ,int d) 19 { 20 while(x<maxn) 21 { 22 c[x] += d; 23 x += lowbit(x); 24 } 25 } 26 27 ll sum(int x) 28 { 29 ll ret = 0; 30 while(x>0
) 31 { 32 ret += c[x]; 33 x -= lowbit(x); 34 } 35 return ret; 36 } 37 38 int main() 39 { 40 //freopen("in.txt","r",stdin); 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%d",&a[i]); 45 b[i] = a[i]; 46 }
47 sort(b+1,b+n+1); 48 int num = unique(b+1,b+n+1)-(b+1); 49 ll ans1 = 0, ans2 = 0; 50 ll mx = 1e18; 51 for(int i=1;i<=n;i++) 52 { 53 a[i] = lower_bound(b+1,b+n+1,a[i])-(b+1); 54 a[i]++; 55 ans1 += (ll)(n-i+1)*(sum(n)-sum(a[i])); 56 if(ans1>=mx) ans2 += ans1/mx, ans1%=mx; 57 add(a[i],i); 58 } 59 if(ans2) printf("%lld%018lld\n",ans2,ans1); 60 else printf("%lld\n",ans1); 61 return 0; 62 }

牛客練習賽7 E 珂朵莉的數列(樹狀數組+爆long long解決方法)