51nod1680 区间求和
有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和。这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求
∑nk=1∑n−k+1i=1∑nj=i+k−1 区间前K大和
输入五个数n,a1,A,B,C。a1表示第一个数,A,B,C用来生成其余n-1个数。a(i)=(a(i-1)*A+B)mod C。1<=n<=1,000,000,0<=a1,A,B,C<=1,000,000,000
一个数表示答案,最后答案对1,000,000,007取模。
3 3 1 1 10
三个数为3,4,5
K=1:[1,1]=3,[1,2]=[2,2]=4,[1,3]=[2,3]=[3,3]=5(表示各个区间在k=1时的答案)
K=2:[1,2]=7,[2,3]=[1,3]=9
K=3:[1,3]=12
题目大意:求sigma(k=1--n) f(k),k为区间大于等于k的前k大的和。 题解:树状数组
对于区间[l,r],假设它的答案为ans,如果新增一个数a[r+1],那么它
出现的次数就是[l,r]中小于它的数的个数。如果Ai<Aj,i<j,那么包含这两个数
的区间的个数为i*(n-j+1),则对答案的贡献为Aj*(n-j+1),对于Aj>Ai,i>j,
倒过来再处理一遍。注意:双关键字排序 代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mod 1000000007
#define maxn 1000009
#define LL long long
using namespace std; LL n,ans,A,B,C,a[maxn],tree[maxn];
typedef pair<LL,int> PII;
PII b[maxn]; void add(int x,int p){
for(;x<=n;x+=x&(-x))tree[x]=(tree[x]+p)%mod;
} LL getsum(int x){
LL all=;
for(;x;x-=x&(-x))all=(all+tree[x])%mod;
return all;
} int main(){
scanf("%lld%lld%lld%lld%lld",&n,&a[],&A,&B,&C);
b[].first=a[];b[].second=;
for(int i=;i<=n;i++){
a[i]=(a[i-]*A+B)%C;
b[i].first=a[i];b[i].second=i;
}
sort(b+,b+n+);
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+n+,make_pair(a[i],i))-b;
for(int i=;i<=n;i++){
add(a[i],i);
LL tmp=b[a[i]].first*1LL*(n-i+)%mod;
LL amp=getsum(a[i]);
ans=(ans%mod+tmp*amp%mod)%mod;
}
memset(tree,,sizeof(tree));
for(int i=n;i>=;i--){
LL tmp=(b[a[i]].first*1LL*i)%mod;
LL amp=getsum(a[i]);
ans=(ans%mod+tmp*amp%mod)%mod;
add(a[i],n-i+);
}
printf("%lld\n",ans);
return ;
}
51nod1680 区间求和的更多相关文章
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- vijos1740 聪明的质监员 (二分、区间求和)
http://www.rqnoj.cn/problem/657 https://www.vijos.org/p/1740 P1740聪明的质检员 请登录后递交 标签:NOIP提高组2011[显示标签] ...
- LightOJ 1112 Curious Robin Hood (单点更新+区间求和)
http://lightoj.com/volume_showproblem.php?problem=1112 题目大意: 1 i 将第i个数值输出,并将第i个值清0 2 i v ...
- POJ 3468 A Simple Problem with Integers(线段树区间求和)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
转载请注明出处:http://blog.csdn.net/u012860063 Description You have N integers, A1, A2, ... , AN. You need ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...
- D 区间求和 [数学 树状数组]
D 区间求和 题意:求 \[ \sum_{k=1}^n \sum_{l=1}^{n-k+1} \sum_{r=l+k-1}^n 区间前k大值和 \] 比赛时因为被B卡了没有深入想这道题 结果B没做出来 ...
- [用CDQ分治解决区间加&区间求和]【习作】
[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...
随机推荐
- iOS NSCoding 的学习 和 使用
起初接触的轻量级 物理存储 方式 是 plist 可以存储 系统级别的 字典 数组 但是不能存储自定义的对象类 那会 用自定义对象做存储的 需求也不大 主要 是 还没建立面向对象意识,会的也少. ...
- fastReport 绑定DataBand数据源后还是打印出一条数据
升级了fastreport到v2018后,打印出现问题,datasource是多条数据,可打印出来始终只显示第一条 DataBand dataBand = report.FindObject(&quo ...
- Android DDMS应用
具体可见http://developer.android.com/tools/debugging/ddms.html. DDMS为IDE和emultor.真正的android设备架起来了一座桥梁.开发 ...
- CSS3手风琴下拉菜单
在线演示 本地下载
- C语言串口
可以用open和fopen来打开文件,open偏底层,fopen来自于open更顶层.(根据公司某个项目看了源码用的open) #include <stdio.h>#include < ...
- springmvc异常处理(非注解与注解)
1.异常 程序中的异常一般分为两类:预期异常,运行时异常.前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常.后者主要通过代码规范.测试等手段来减少异常的发生.一般,我们在系统的DAO.Ser ...
- JAVA获取Spring上下文
1. 添加监听 public class SpringContextListener implements ServletContextListener { //获取spring注入的bean对象 p ...
- 论4.1loli模拟赛
论如何合理的挂.... T1: 后缀数组+找规律...没了,别的就没什么了.... T2: 树链剖分+lca....没了, 别的没什么了..... T3: 平衡树可过..然后数据有两组错的... 实际 ...
- maven 中pom.xml文件依赖包从本地加载如何配置?
比如我现在有一个需求是:项目中要加载ueditor的jar架构包,并且用maven构建的项目 那么在pom.xml文件中如配置: 说明:${project.basedir} 是maven 自带(内置) ...
- codeforces459D:Pashmak and Parmida's problem
Description Parmida is a clever girl and she wants to participate in Olympiads this year. Of course ...