题意:

给出一个长度为\(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. HCNA配置RIPv1

    1.拓扑图 2.配置 R1 The device is running! ###### <Huawei>sys Enter system view, return user view wi ...

  2. HTML5开发,背后的事情你知道吗?

    现在的H5越来越受到企业或者是开发者的一个大力的追捧,已经成为网络推广必不可少的一个使用的工具,相信还有很多朋友现在都不知道H5是个什么东西,本文将为大家讲的是关于H5一些分类的问题,让你进一步的去学 ...

  3. 【转载】每天一个Linux命令

    目  录 每天一个linux命令(1)  : ls 命令 每天一个linux命令(2)  : cd 命令 每天一个linux命令(3)  : pwd 命令 每天一个linux命令(4)  : mkdi ...

  4. UI5 Source code map机制的细节介绍

    在我的博客A debugging issue caused by source code mapping里我介绍了在我做SAP C4C开发时遇到的一个曾经困扰我很久的问题,最后结论是这个问题由于Jav ...

  5. Java访问重定向接口

    背景:开发做了一个免登陆的接口,方便我后续给管理后台做一些小工具,问题来了,给的免登陆接口是个302如图的test_login,在重定向一个200的接口(eload_admin), 原本开始这样做:0 ...

  6. 关于nutz跨服务器上传文件

    关于nutz跨服务器上传文件  发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子  标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...

  7. Cocos2d-x手机游戏开发必备C++语言基础

    http://edu.51cto.com/course/course_id-1380-page-1.html

  8. 使用Excel管理命令输出

    效果图:(饼状图为后添加) 实现代码:

  9. elsevier期刊要求翻译

    百度文库 http://wenku.baidu.com/view/e20a27e84afe04a1b071de4e.html 官网文档 http://www.elsevier.com/journals ...

  10. Notepad++配色方案

    1.下载notepad++样式文件 styles.xml 2.将该文件拷贝到 C:\Users\Administrator\AppData\Roaming\Notepad++ 目录(将Administ ...