D 区间求和 [数学 树状数组]
D 区间求和
题意:求
\]
比赛时因为被B卡了没有深入想这道题 结果B没做出来后面的题也没做
化一下式子
&= \sum_{l=1}^n \sum_{r=l}^n \sum_{k=l}^r a_k \cdot (1+\sum_{i=l}^r [a_i < a_k]) \\
&考虑一个数的贡献 \\
&= \sum_{k=1}^n \sum_{i=k+1}^n a_k \cdot [a_i < a_k] \cdot k \cdot (n-i+1)\\
&+ \sum_{k=1}^n \sum_{i=1}^{k-1} a_k \cdot [a_i < a_k] \cdot i \cdot (n-k+1) \\
&+ \sum_{k=1}^n a_k \cdot k \cdot (n-k+1)
\end{align}
\]
简单的二维偏序问题,树状数组搞一下就行了
注意数相等的情况!第二个二维偏序把相等认为是大于就行了
一定要考虑这种做题方法:
把一些最大值、最小值、k大值之类的关系用求和式子表示出来进行化简
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 1e6+5, mo = 1e9+7;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
int n, a[N], mp[N]; ll A, B, C;
ll c[N];
inline void mod(ll &x) {if(x >= mo) x -= mo; else if(x < 0) x += mo;}
inline void add(int p, ll v) {for(; p<=n; p+=p&-p) mod(c[p] += v);}
inline ll sum(int p) {ll ans=0; for(; p; p-=p&-p) mod(ans += c[p]); return ans;}
void solve() {
ll ans = 0;
for(int k=n; k>=1; k--) mod(ans += (ll) mp[a[k]] * k %mo * sum(a[k]) %mo), add(a[k], (n-k+1));
memset(c, 0, sizeof(c));
for(int k=1; k<=n; k++) mod(ans += (ll) mp[a[k]] * (n-k+1) %mo * sum(a[k]-1) %mo), add(a[k], k);
for(int k=1; k<=n; k++) mod(ans += (ll) mp[a[k]] * k %mo * (n-k+1) %mo);
printf("%lld\n", (ans + mo) %mo);
}
int main() {
freopen("in", "r", stdin);
n=read(); a[1]=read(); A=read(); B=read(); C=read();
for(int i=2; i<=n; i++) a[i] = (a[i-1] * A + B) % C;
for(int i=1; i<=n; i++) mp[i] = a[i];
sort(mp+1, mp+1+n); mp[0] = unique(mp+1, mp+1+n) - mp - 1;
for(int i=1; i<=n; i++) a[i] = lower_bound(mp+1, mp+1+mp[0], a[i]) - mp;
solve();
}
D 区间求和 [数学 树状数组]的更多相关文章
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
- hdu-5700 区间交(二分+树状数组)
题目链接: 区间交 Problem Description 小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些 ...
- FZU2224 An exciting GCD problem 区间gcd预处理+树状数组
分析:(别人写的) 对于所有(l, r)区间,固定右区间,所有(li, r)一共最多只会有log个不同的gcd值, 可以nlogn预处理出所有不同的gcd区间,这样区间是nlogn个,然后对于询问离线 ...
- 牛客网暑期ACM多校训练营(第一场):J-Different Integers(分开区间不同数+树状数组)
链接:J-Different Integers 题意:给出序列a1, a2, ..., an和区间(l1, r1), (l2, r2), ..., (lq, rq),对每个区间求集合{a1, a2, ...
- SPOJ - DQUERY(区间不同数+树状数组)
链接:SPOJ - DQUERY 题意:求给定区间不同数的个数(不更新). 题解:离线+树状数组. 对所求的所有区间(l, r)根据r从小到大排序.从1-n依次遍历序列数组,在树状数组中不断更新a[i ...
- [CSP-S模拟测试]:天才绅士少女助手克里斯蒂娜(数学+树状数组)
题目描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响. 选取显像管的任意一个平面,一开始平面内有个$n$电子,初始速度分别为$v_i$,定义飘升系数为$$\sum \li ...
- [CSP-S模拟测试]:Equation(数学+树状数组)
题目描述 有一棵$n$个点的以$1$为根的树,以及$n$个整数变量$x_i$.树上$i$的父亲是$f_i$,每条边$(i,f_i)$有一个权值$w_i$,表示一个方程$x_i+x_{f_i}=w_i$ ...
- 【XSY2714】大佬的难题 数学 树状数组
题目描述 给你三个排列\(A,B,C\),求 \[ \sum_{1\leq x,y\leq n}[a_x<a_y][b_x<b_y][c_x<c_y] \] \(n\leq 2\ti ...
随机推荐
- Slim Span(Kruskal)
题目链接:http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Subm ...
- Python 3 利用 Dlib 19.7 实现人脸识别和剪切
0.引言 利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上: 实现的效果如下图所示,将图1原图中的6张人脸检测出来,然后剪切下来,在图像窗口中依次 ...
- [国嵌攻略][160][SPI驱动程序设计]
SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...
- HTTP协议----->连接管理
1. TCP连接 1.1 TCP为HTTP提供了一条可靠的比特传输管道. TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提 ...
- js keys方法和foreach方法区别
keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...
- 织梦CMS提示DedeTag Engine Create File False错误的解决办法总结
今天帮客户升级站点,遇到了一个老问题,生成栏目的时候提示"DedeTag Engine Create File False",突然发觉这个问题竟然在以前做站的时候困扰过我多次,于是 ...
- Vue版本过渡变化
到了2.0以后,有哪些变化: 在每个组件模板,不在支持片段代码 之前: <template id="aaa"> <h3>我是组件</h3>< ...
- destoon标签
http://blog.csdn.net/oYuHuaChen/article/details/54601509 ------------
- webkit
HTML, 从HTML文档的开始到结束排列: <meta name="viewport" content="width=device-width, initial- ...
- Redis的事务功能详解
Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础.Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Re ...