bzoj5055 膜法师

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj5055 膜法师相关的知识,希望对你有一定的参考价值。

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
 
正解:主席树。
裸的主席树。
 
 1 #include <bits/stdc++.h>
 2 #define il inline
 3 #define RG register
 4 #define ll long long
 5 #define rhl (19260817)
 6 #define N (300010)
 7 
 8 using namespace std;
 9 
10 int sum[20*N],ls[20*N],rs[20*N],rt[N],a[N],hsh[N],n,sz,tot,ans;
11 
12 il int gi(){
13   RG int x=0,q=1; RG char ch=getchar();
14   while ((ch<0 || ch>9) && ch!=-) ch=getchar();
15   if (ch==-) q=-1,ch=getchar();
16   while (ch>=0 && ch<=9) x=x*10+ch-48,ch=getchar();
17   return q*x;
18 }
19 
20 il void insert(RG int x,RG int &y,RG int l,RG int r,RG int p,RG int v){
21   sum[y=++sz]=sum[x]+v; if (sum[y]>=rhl) sum[y]-=rhl;
22   ls[y]=ls[x],rs[y]=rs[x]; if (l==r) return; RG int mid=(l+r)>>1;
23   p<=mid?insert(ls[x],ls[y],l,mid,p,v):insert(rs[x],rs[y],mid+1,r,p,v); return;
24 }
25 
26 il int query(RG int x,RG int y,RG int l,RG int r,RG int xl,RG int xr){
27   if (x==y) return 0;
28   if (xl<=l && r<=xr){
29     RG int res=sum[y]-sum[x];
30     return res<0 ? res+rhl : res;
31   }
32   RG int mid=(l+r)>>1;
33   if (xr<=mid) return query(ls[x],ls[y],l,mid,xl,xr);
34   if (xl>mid) return query(rs[x],rs[y],mid+1,r,xl,xr);
35   RG int res=query(ls[x],ls[y],l,mid,xl,mid)+query(rs[x],rs[y],mid+1,r,mid+1,xr);
36   return res>=rhl ? res-rhl : res;
37 }
38 
39 int main(){
40 #ifndef ONLINE_JUDGE
41   freopen("mogic.in","r",stdin);
42   freopen("mogic.out","w",stdout);
43 #endif
44   n=gi(); for (RG int i=1;i<=n;++i) a[i]=gi(),hsh[++tot]=a[i];
45   sort(hsh+1,hsh+tot+1),tot=unique(hsh+1,hsh+tot+1)-hsh-1;
46   for (RG int i=1;i<=n;++i){
47     a[i]=lower_bound(hsh+1,hsh+tot+1,a[i])-hsh;
48     insert(rt[i-1],rt[i],1,tot,a[i],hsh[a[i]]%rhl);
49   }
50   for (RG int i=2,l,r;i<n;++i){
51     l=a[i]>1 ? query(rt[0],rt[i],1,tot,1,a[i]-1) : 0;
52     r=a[i]<tot ? query(rt[i],rt[n],1,tot,a[i]+1,tot) : 0;
53     ans=(ans+1LL*l*r%rhl*hsh[a[i]])%rhl;
54   }
55   cout<<ans; return 0;
56 }

 

以上是关于bzoj5055 膜法师的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ_5055_膜法师_树状数组+离散化

bzoj5055 膜法师

[BZOJ 5055]膜法师

bzoj5055 膜法师

bzoj 5055: 膜法师——树桩数组

bzoj5055膜法师(离散化+树状数组)