1. 程式人生 > >bzoj5055 膜法師

bzoj5055 膜法師

code 偉大的 ring 線段 序列 目前 urn hup 等於

Description

在經歷過1e9次大型戰爭後的宇宙中現在還剩下n個完美維度, 現在來自多元宇宙的膜法師,想偷取其中的三個維度為偉大的長者續秒, 顯然,他能為長者所續的時間,為這三個維度上能量的乘積, 但目前的宇宙很不樂觀,胡亂偷取可能造成維度的崩潰, 所以,他必須按逆序偷取這些維度,且在偷取中, 每次偷取的維度的能量必須嚴格小於他上次偷取的能量, 由於膜法師生活在多元宇宙,所以他可以讓所有可能的偷取方案全部發生 題目描述 但他數學不好,所以找到了你幫他求出能為長者續幾秒, 你要做的,就是在給定的維度序列a中, 求出所有滿足i<j<k且ai<aj<ak的ai*aj*ak的和 即 ∑ (a_i*a_j*a_k),要求 i<j<k 且 a_i<a_j<a_k

Input

第一行1個數 n 第二行n個數 a_i

Output

一個數,表示能為長者續幾秒,由於長者是不朽的, 所以能活很久,不妨將答案對**19260817**取模吧

Sample Input

樣例1
4
1 2 3 4

樣例二
10
6 8 4 1 3 0 7 5 9 2

Sample Output

樣例輸出1
50
樣例輸出2
1737
樣例解釋
對於樣例 1
有滿足條件的序列為
{1,2,3}——6
{1,2,4}——8
{1,3,4}——12
{2,3,4}——24
ans=6+8+12+24=50
數據範圍
30%的數據n<=300
60%的數據n<=3000
100%的數據n<=300000
0<=a[i]<=2147483647
先離散 枚舉中間點,找到所有符合條件的i,k 對於枚舉的j,對答案貢獻a[j]∑ika[i]a[k] 就等於a[j]*(∑ia[i]*∑ka[k]) 維護兩個線段樹,每次求出和,再將a值加入
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 int Mod=19260817;
 8 int n,sz;
 9 ll ans,sum1[300001
],sum2[300001],has[300001],a[300001],b[300001]; 10 ll c[1200001][3]; 11 void pushup(int rt,int p) 12 { 13 c[rt][p]=(c[rt*2][p]+c[rt*2+1][p])%Mod; 14 } 15 void update(int rt,int l,int r,int x,ll d,int p) 16 { 17 if (l==r) 18 { 19 c[rt][p]+=d; 20 c[rt][p]%=Mod; 21 return; 22 } 23 int mid=(l+r)/2; 24 if (x<=mid) update(rt*2,l,mid,x,d,p); 25 else update(rt*2+1,mid+1,r,x,d,p); 26 pushup(rt,p); 27 } 28 ll query(int rt,int l,int r,int L,int R,int p) 29 { 30 if (l>=L&&r<=R) 31 { 32 return c[rt][p]; 33 } 34 int mid=(l+r)/2; 35 ll s=0; 36 if (L<=mid) s+=query(rt*2,l,mid,L,R,p); 37 s%=Mod; 38 if (R>mid) s+=query(rt*2+1,mid+1,r,L,R,p); 39 s%=Mod; 40 return s; 41 } 42 int main() 43 { 44 int i; 45 cin>>n; 46 for (i=1; i<=n; i++) 47 { 48 scanf("%lld",&a[i]); 49 b[i]=a[i]; 50 } 51 sort(b+1,b+n+1); 52 sz=unique(b+1,b+n+1)-(b+1); 53 for (i=1; i<=n; i++) 54 { 55 ll x=a[i]; 56 a[i]=lower_bound(b+1,b+sz+1,a[i])-b; 57 has[a[i]]=x%Mod; 58 } 59 for (i=1; i<=n; i++) 60 { 61 if (a[i]-1>=1) 62 sum1[i]=query(1,1,sz,1,a[i]-1,1)%Mod; 63 update(1,1,sz,a[i],has[a[i]],1); 64 } 65 for (i=n; i>=1; i--) 66 { 67 if (a[i]+1<=sz) 68 sum2[i]=query(1,1,sz,a[i]+1,sz,2)%Mod; 69 update(1,1,sz,a[i],has[a[i]],2); 70 } 71 for (i=2; i<n; i++) 72 { 73 ans+=(has[a[i]]*sum1[i]%Mod)*sum2[i]%Mod; 74 ans%=Mod; 75 } 76 cout<<ans; 77 }

bzoj5055 膜法師