51Nod 1680 区间求和 树状数组
题意:
给出一个长度为\(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 区间求和 树状数组的更多相关文章
- nyoj--108--士兵杀敌(一)(区间求和&&树状数组)
士兵杀敌(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军现在想知 ...
- 51nod_1199 树的先跟遍历+区间更新树状数组
题目是中文,所以不讲题意 做法顺序如下: 使用先跟遍历,把整棵树平铺到一维平面中 使用自己整的区间更新树状数组模板进行相关操作. http://www.cnblogs.com/rikka/p/7359 ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
- 区间操作---树状数组&&线段树
涉及区间操作的一些套路必须要会呀 区间加减为了偷懒能不写线段树so我选择树状数组!! 但是区间乘除,最大值我想了想还是用线段树分块吧. 树状数组: 这里用网上的一张图: 这里灰色数组是原本的数组(a[ ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- ACM学习历程—HDU5700 区间交(树状数组 && 前缀和 && 排序)
http://acm.hdu.edu.cn/showproblem.php?pid=5700 这是这次百度之星初赛2B的第五题.省赛回来看了一下,有这样一个思路:对于所有的区间排序,按左值排序. 然后 ...
- 51Nod 1272最大距离 (树状数组维护前缀最小值)
题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...
- 51nod 1681 公共祖先 | 树状数组
51nod 1681 公共祖先 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完 ...
- 51nod 1081 子段求和(线段树 | 树状数组 | 前缀和)
题目链接:子段求和 题意:n个数字序列,m次询问,每次询问从第p个开始L长度序列的子段和为多少. 题解:线段树区间求和 | 树状数组区间求和 线段树: #include <cstdio> ...
随机推荐
- sharepoint 查阅项SPFieldLookup 赋值 .
在项目中,经常会涉及列表或者文档库之间的相互引用,而这个时候我们用的更多的就是查阅项(lookup),以前没有去关注取值或者赋值的问题,今天正好碰到一个Case,就顺道总结一下.我们知道链接和图片的字 ...
- Lucene——索引过程分析Index
Lucene索引过程分为3个主要操作步骤:将原始文档转换成文本.分析文本.将分析好的文本保存至索引中 一.提取文本和创建文档 从 pdf.word等非纯文本格式文件中,提取文本格式信息.建立起对应的, ...
- 微信小程序又一爆炸功能上线-云开发
云开发介绍 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开 ...
- vos对接时业务确认及信息安全责任承诺书
业务确认及信息安全责任承诺书 双方达成一致,******网络科技有限公司向 有限公司提供中国移动网内语音线路接入服务,保证资源长期使用,保证线路资源接通率标 准,合 ...
- 创建React工程:React工程模板
这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>index.js <!DOCTYP ...
- 如何在windows下运行Linux命令?(转载)
在windows上可以运行或使用linux下面的命令吗?可以,小编今天就来分享怎么样让Windows支持Linux命令,做这些安装和设置后,就可以非常方便的在windows系统中使用linux下面的命 ...
- js中关于假值和空数组的总结
先上x==y运算符的算法细节: 如果x不是正常值(比如抛出一个错误),中断执行. 如果y不是正常值,中断执行. 如果Type(x)与Type(y)相同,执行严格相等运算x === y. 如果x是nul ...
- cudaMallocPitch – 向GPU分配存储器
概要 cudaError_t cudaMallocPitch( void** devPtr,size_t* pitch,size_t widthInBytes,size_t height ) 说明 向 ...
- js 实现链表
我们通常会在c++这类语言中学习到链表的概念,但是在js中由于我们可以动态的扩充数组,加之有丰富的原生api.我们通常并不需要实现链表结构.由于突发奇想,我打算用js实现一下: 首先我们要创建链表: ...
- Git笔记(pull/push)
一.从远程服务器上获取分支 git pull <远程主机名> <远程分支>:<本地分支> 例如 git pull origin master:loacal_bran ...