传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=5055

  这道题……不得不说,从标题到题面都能看出一股浓浓的膜法气息……苟……

  题意就是统计顺序三元组(似乎可以这么叫吧)的乘积和。顺序三元组有个低阶版本叫做顺序对,顺序对有一个亲兄弟叫做逆序对。既然我们可以用值域树状数组来处理关于顺/逆序对,因此也可以尝试用同样的方法处理这道题。

  我们可以固定a[j],求剩下的a[i]和a[k]。ans=a[j]*sigma(a[i]*a[k])

  于是我们就把一个顺序三元组拆成了两个顺序对,一个是a[i]<a[j]且i<j,另一个是a[j]<a[k]且j<k,且这两个逆序对是不干扰的,可以直接把结果乘起来。

  所以我们对于每个数,求出左边比它小的数的总和,和右边比他大的数的总和,记为l[i]和r[i]。于是ans=sigma(a[i]*l[i]*r[i])

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
#define mod 19260817
using namespace std;
inline ll read()
{
ll tmp=; char f=,c=getchar();
while(c<''||''<c){if(c=='-')f=-; c=getchar();}
while(''<=c&&c<=''){tmp=tmp*+c-''; c=getchar();}
return tmp*f;
}
ll c[];
ll a[],id[],rk[];
ll l[],r[];
int n;
bool cmp(ll x,ll y){return a[x]<a[y];}
void add(int x,ll k){while(x<=n){c[x]+=k; x+=x&(-x);}}
ll getsum(int x){ll sum=; while(x){sum+=c[x]; x-=x&(-x);} return sum;}
int main()
{
int i;
n=read();
for(i=;i<=n;i++)a[i]=read(),id[i]=i;
sort(id+,id+n+,cmp);
rk[id[]]=;
for(i=;i<=n;i++){
rk[id[i]]=rk[id[i-]];
if(a[id[i]]>a[id[i-]])++rk[id[i]];
}
for(i=;i<=n;i++)c[i]=;
for(i=;i<=n;i++){
l[i]=getsum(rk[i]-)%mod; add(rk[i],a[i]);
}
for(i=;i<=n;i++)c[i]=; ll sum=;
for(i=n;i;i--){
r[i]=(sum-getsum(rk[i]))%mod; add(rk[i],a[i]); sum+=a[i];
}
ll ans=;
for(i=;i<=n;i++)ans=(ans+l[i]*r[i]%mod*a[i])%mod;
printf("%lld\n",ans);
return ;
}

bzoj5055

【bzoj5055】膜法师(离散化+树状数组)的更多相关文章

  1. 【bzoj5055】膜法师 离散化+树状数组

    题目描述 给定一个序列$a$,求满足$i<j<k$且$a_i<a_j<a_k$的三元组$(i,j,k)$的个数. 输入 第一行1个数 n 第二行n个数 a_i 输出 一个数,表 ...

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

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  3. CodeForces 540E - Infinite Inversions(离散化+树状数组)

    花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...

  4. Ultra-QuickSort(归并排序+离散化树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 50517   Accepted: 18534 ...

  5. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  6. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  7. poj-----Ultra-QuickSort(离散化+树状数组)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 38258   Accepted: 13784 ...

  8. Code Forces 652D Nested Segments(离散化+树状数组)

     Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. hdu 3015 Disharmony Trees (离散化+树状数组)

    Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组

    题目描述 给出一个长度为n的序列,求所有元素的和在[L,R]范围内的连续子序列的个数. 输入 第一行包含三个整数N,L和R,分别表示寿司盘数,满意度的下限和上限. 第二行包含N个整数Ai,表示小Z对寿 ...

随机推荐

  1. unintest基础1

    import unittest class Testfunc(unittest.TestCase): def testfunc(self): print('testfunc1') def testfu ...

  2. Uvalive6885(最短路)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129723 题目大意:n个点,m条边,求出从0到n的最短距离,输出途 ...

  3. 【BZOJ2213】[Poi2011]Difference DP

    [BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...

  4. delphi小知识 点(if条件符,to_date)

    1.if条件 与:and 或:or 不等于:<> 等于:= 例子: if(j=1)and(nFH<>0) then begin tLCH:=Trim(copy(tSAMPLEI ...

  5. 是面向对象设计五个基本原则(SOLID)

    单一职责原则 - 搜狗百科 https://baike.sogou.com/v51360965.htm 单一职责原则并不是一个孤立的面向对象设计原则,它是面向对象设计五个基本原则(SOLID)之一.这 ...

  6. MySQL中Cardinality值的介绍

    1)         什么是Cardinality 不是所有的查询条件出现的列都需要添加索引.对于什么时候添加B+树索引.一般的经验是,在访问表中很少一部分时使用B+树索引才有意义.对于性别字段.地区 ...

  7. Oracle ErrorStack 使用和阅读具体解释

    一.概述 在Oracle数据库执行过程中,我们常常会遇到这样或那样的错误.可是错误的提示并不详细,加大了我们在诊断问题时的难度. ErrorStack是Oracle提供的一种对于错误堆栈进行跟踪的方法 ...

  8. 教你使用SQL数据库索引(1-15)

    原文地址:http://www.sqlservercentral.com/stairway/72399/ 中文地址:https://www.cnblogs.com/tjy9999/category/4 ...

  9. 003-整型入栈指令(iconst、bipush、sipush、ldc)

    一.概述 官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html参考地址:http://www.linmuxi.com/201 ...

  10. LeetCode-day05

    45. Single Number 在个数都为2的数组中找到个数为1的数 46. Missing Number 在数组中找到从0到n缺失的数字 47. Find the Difference 找两个字 ...