题意:

给出一个长度为\(n\)的数列\(A_i\),定义\(f(k)\)为所有长度大于等于\(k\)的子区间中前\(k\)大数之和的和。

求\(\sum_{k=1}^{n}f(k) \; mod \; 10^9+7\)。

分析:

从某个长度为\(k\)的子区间对答案的贡献来看:

它的长度大于等于\(k\),所以区间中每个都加到答案中一次。

它的长度还大于等于\(k-1\),区间中前\(k-1\)大的数加到答案中一次。

……

以此类推。

对于每个数\(A_i\):如果这个区间中有\(x\)个小于\(A_i\)的数,这个数对答案就会贡献\(x+1\)次。

所以如果存在\(A_i<A_j,i<j\),包含这两个数区间的个数为\(i \times (n - j + 1)\),

对答案的贡献为\(A_j \cdot i \cdot (n - j + 1)\)。

\(A_i<A_j,i>j\)的情况类似,所以可以枚举\(A_j\),求和用一个树状数组维护。

  • 对于数字相等的情况还是要区分开来的,可以用它们的下标再比较一次大小,这样做到了不重不漏。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
#define REP(i, a, b) for(int i = a; i < b; i++)
#define PER(i, a, b) for(int i = b - 1; i >= a; i--)
#define SZ(a) ((int)a.size())
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define ALL(a) a.begin(), a.end()
#define F first
#define S second
#define lowbit(x) (x&(-x))
typedef long long LL;
typedef pair<LL, int> PII; const int maxn = 1000000 + 10;
const LL MOD = 1000000007LL; LL mul(LL a, LL b) { return a * b % MOD; }
void add(LL& a, LL b) { a += b; if(a >= MOD) a -= MOD; } int n;
LL A, B, C;
LL a[maxn];
PII b[maxn]; LL bit[maxn];
void init() { memset(bit, 0, sizeof(bit)); }
void update(int x, int v) {
while(x <= n) {
add(bit[x], v);
x += lowbit(x);
}
}
int query(int x) {
LL ans = 0;
while(x) {
add(ans, bit[x]);
x -= lowbit(x);
}
return ans;
} int main() {
scanf("%d%lld%lld%lld%lld", &n, &a[1], &A, &B, &C);
A %= C; B %= C;
b[1].F = a[1];
b[1].S = 1;
REP(i, 2, n + 1) {
a[i] = ((a[i - 1] * A) % C) + B;
if(a[i] >= C) a[i] -= C;
b[i].F = a[i];
b[i].S = i;
}
sort(b + 1, b + 1 + n);
REP(i, 1, n + 1)
a[i] = lower_bound(b + 1, b + 1 + n, MP(a[i], i)) - b; LL ans = 0;
REP(i, 1, n + 1) {
update(a[i], i);
LL t = mul(b[a[i]].F, (LL)(n - i + 1));
add(ans, mul(query(a[i]), t));
}
init();
PER(i, 1, n + 1) {
LL t = mul(b[a[i]].F, (LL)i);
add(ans, mul(query(a[i]), t));
update(a[i], n - i + 1);
}
printf("%lld\n", ans); return 0;
}

51Nod 1680 区间求和 树状数组的更多相关文章

  1. nyoj--108--士兵杀敌(一)(区间求和&&树状数组)

    士兵杀敌(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军现在想知 ...

  2. 51nod_1199 树的先跟遍历+区间更新树状数组

    题目是中文,所以不讲题意 做法顺序如下: 使用先跟遍历,把整棵树平铺到一维平面中 使用自己整的区间更新树状数组模板进行相关操作. http://www.cnblogs.com/rikka/p/7359 ...

  3. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  4. 区间操作---树状数组&&线段树

    涉及区间操作的一些套路必须要会呀 区间加减为了偷懒能不写线段树so我选择树状数组!! 但是区间乘除,最大值我想了想还是用线段树分块吧. 树状数组: 这里用网上的一张图: 这里灰色数组是原本的数组(a[ ...

  5. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  6. ACM学习历程—HDU5700 区间交(树状数组 && 前缀和 && 排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=5700 这是这次百度之星初赛2B的第五题.省赛回来看了一下,有这样一个思路:对于所有的区间排序,按左值排序. 然后 ...

  7. 51Nod 1272最大距离 (树状数组维护前缀最小值)

    题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  8. 51nod 1681 公共祖先 | 树状数组

    51nod 1681 公共祖先 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完 ...

  9. 51nod 1081 子段求和(线段树 | 树状数组 | 前缀和)

    题目链接:子段求和 题意:n个数字序列,m次询问,每次询问从第p个开始L长度序列的子段和为多少. 题解:线段树区间求和 | 树状数组区间求和 线段树: #include <cstdio> ...

随机推荐

  1. django orm 时间字段讲解

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...

  2. Maven 私有库和本地库的安装与配置 Sonatype Nexus + Maven

    环境:CentOS 7.0 Final.JDK8.Sonatype Nexus.Maven 虚拟机模拟IP:192.168.16.167 备注:root权限用户操作 前提:已安装 JDK8 并配置好了 ...

  3. eplise一键集成工具

    因为要做平台,后台的内容就由我负责,目前想让测试人员  在本地使用eplise可以进行脚本开发,但是很多人都死在了搭建环境的道路上,那我就做了一键集成,点击就可以把所需要的配置项进行配置,总结:实际就 ...

  4. Heterogeneity Activity Recognition Data Set类别

    Heterogeneity Activity Recognition Data Set:https://archive.ics.uci.edu/ml/datasets/Heterogeneity+Ac ...

  5. 合格PHP工程师的知识结构 (转载)

    工作有些年头了,从学校开始自学ASP,偶然因为PHP一个功能爱上它(ASP上传代码要写好多,PHP基本几行就搞定了),从此走上了 ”拍黄片“ 之路.结合这几年的工作经验,说说我对PHP工程师知识结构的 ...

  6. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用

    奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...

  7. B1954 The xor-longest Path

    爆炸入口 给定一颗带权值的,节点数为n的树,求树上路径最大异或和. solution: 先dfs将所有点到根的异或和算出来.然后放进tire树中贪心. #include<cstdio> # ...

  8. hbase的coprocessor使用(转)

    http://www.360doc.com/content/13/0320/09/4675893_272623864.shtml

  9. CXF报错[1 counts of IllegalAnnotationExceptions]and[Two classes have the same XML type name]and[Use @XmlType.name and @XmlType.namespace to assign different names to them]

    启动时CXF报错如下: Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalA ...

  10. 前端jQuery基本语法

    1.概念 1.1基础知识 jQuery是一个兼容多浏览器的JavaScript库,封装了开发过程中常用的一些功能,类似Python模块 jQuery就是用JS写的,JS是基础 jQuery写起来简单, ...