51Nod1680 区间求和

前缀和----指定区间求和 对于一个给定的数组A,它的前缀和数组S中[i]表示从第一个元素到第i个元素的总和。S[i] =:在O(1)的时间求出。 阅读详情

.
题目点这里
大概是这么一个问题
∑ k = 1 n ∑ i = 1 n − k + 1 ∑ j = i + k − 1 n 区 间 前 k 大 元 素 和 \sum_{k=1}^n\sum_{i=1}^{n-k+1}\sum_{j=i+k-1}^n区间前k大元素和 k=1∑n​i=1∑n−k+1​j=i+k−1∑n​区间前k大元素和
观察式子并加以变形
= ∑ i = 1 n ∑ j = i n ∑ k = 1 j − i + 1 区 间 前 k 大 元 素 和 =\sum_{i=1}^n\sum_{j=i}^n\sum_{k=1}^{j-i+1}区间前k大元素和 =i=1∑n​j=i∑n​k=1∑j−i+1​区间前k大元素和
= ∑ i = 1 n ∑ j = i n ∑ k = i j a [ k ] ∗ ∑ l = i j [ a [ l ] ≤ a [ k ] ] =\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^ja[k]*\sum_{l=i}^j[a[l]\le a[k]] =i=1∑n​j=i∑n​k=i∑j​a[k]∗l=i∑j​[a[l]≤a[k]]
= ∑ i = 1 n ∑ j = i n ∑ k = i j a [ k ] ∗ ( 1 + ∑ l = i j [ a [ l ] &lt; a [ k ] ] ) =\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^ja[k]*(1+\sum_{l=i}^j[a[l]&lt;a[k]]) =i=1∑n​j=i∑n​k=i∑j​a[k]∗(1+l=i∑j​[a[l]<a[k]])
到了这里我们需要稍微考虑一下式子的意义
对于一对 i , j ( i &lt; j ) i,j(i&lt;j) i,j(i<j)假如有 a [ i ] &gt; a [ j ] a[i]&gt;a[j] a[i]>a[j]那么这一对 i , j i,j i,j对答案的贡献是多少
应该是 a [ i ] ∗ i ∗ ( n − j + 1 ) a[i]*i*(n-j+1) a[i]∗i∗(n−j+1)( [ i , j ] [i,j] [i,j]这个区间被 a [ i ] ∗ i ∗ ( n − j + 1 ) a[i]*i*(n-j+1) a[i]∗i∗(n−j+1)个区间所包含)
同理如果 a [ j ] &gt; a [ i ] a[j]&gt;a[i] a[j]>a[i]那么贡献就是 a [ j ] ∗ i ∗ ( n − j + 1 ) a[j]*i*(n-j+1) a[j]∗i∗(n−j+1)
算上原来式子里有一个 1 1 1就得到下面这样的式子
= ∑ i = 1 n ( a [ i ] ∗ i ∗ ( n − i + 1 ) + =\sum_{i=1}^n(a[i]*i*(n-i+1)+ =i=1∑n​(a[i]∗i∗(n−i+1)+ ∑ j = i n i ∗ ( n − j + 1 ) ∗ ( a [ i ] ∗ [ a [ i ] &lt; a [ j ] ] + a [ j ] ∗ [ a [ j ] &gt; a [ i ] ] ) ) \sum_{j=i}^n i*(n-j+1)*(a[i]*[a[i]&lt;a[j]]+a[j]*[a[j]&gt;a[i]])) j=i∑n​i∗(n−j+1)∗(a[i]∗[a[i]<a[j]]+a[j]∗[a[j]>a[i]]))
把他拆成三个部分就是
∑ i = 1 n ( a [ i ] ∗ i ∗ ( n − i + 1 ) \sum_{i=1}^n(a[i]*i*(n-i+1) i=1∑n​(a[i]∗i∗(n−i+1)
∑ i = 1 n ∑ j = i n i ∗ ( n − j + 1 ) ∗ a [ j ] ∗ [ a [ j ] &gt; a [ i ] ] \sum_{i=1}^n\sum_{j=i}^n i*(n-j+1)*a[j]*[a[j]&gt;a[i]] i=1∑n​j=i∑n​i∗(n−j+1)∗a[j]∗[a[j]>a[i]]
∑ i = 1 n ∑ j = i n i ∗ ( n − j + 1 ) ∗ a [ i ] ∗ [ a [ j ] &lt; a [ i ] ] \sum_{i=1}^n\sum_{j=i}^n i*(n-j+1)*a[i]*[a[j]&lt;a[i]] i=1∑n​j=i∑n​i∗(n−j+1)∗a[i]∗[a[j]<a[i]]
第一个不用求
第二个可以这样变形
∑ j = 1 n ( n − j + 1 ) ∗ a [ j ] ∑ i = 1 j i ∗ [ a [ j ] &gt; a [ i ] ] \sum_{j=1}^n(n-j+1)*a[j]\sum_{i=1}^j i*[a[j]&gt;a[i]] j=1∑n​(n−j+1)∗a[j]i=1∑j​i∗[a[j]>a[i]]
可以用排序+树状数组解决
第三个一样的
贴个 c o d e code code吧

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1000010
#define LL long long
#define M 1000000007
using namespace std;
int n,s[N],B,C,r[N]; LL A=0;
struct fenwick{
	LL w[N],S;
	inline void clr(){ memset(w,0,sizeof w); }
	inline void add(int x,int k){ for(;x<=n;x+=x&-x) w[x]+=k; }
	inline LL sum(int x){ for(S=0;x;x&=x-1) S=(S+w[x])%M; return S; }
} w;
inline bool c1(int i,int j){ return s[i]<s[j]; }
int main(){
	scanf("%d%d%lld%d%d",&n,s+1,&A,&B,&C); r[1]=1;
	for(int i=2;i<=n;++i) s[r[i]=i]=((LL)s[i-1]*A+B)%C;
	sort(r+1,r+1+n,c1); A=0;	
	for(int i=1,j;i<=n;++i){
		j=r[i];
		A=(A+w.sum(j)*s[j]%M*(n-j+1)%M)%M;
		w.add(j,j);
	}
	w.clr();
	for(int i,j=1;j<=n;++j){
		i=r[j];
		A=(A+(w.sum(n)-w.sum(i))*s[i]%M*i%M)%M;
		w.add(i,n-i+1);
	}
	for(int i=1;i<=n;++i) A=(A+(LL)s[i]*i%M*(n-i+1)%M)%M;
	printf("%lld\n",A);
}
WIFi 开关控制实现-ESP8266 物联网 android studio arduino QT多线程服务器 简介:本例子分硬件和软件两大部分, 软件又分3小部分:1 ESP8266 Arduino 嵌入部分 2 手机APP android studio 3 QT 上位机服务器程序。 总之就是一整套。有些代码会有简单备注说明,非科班出身,写这些代码纯属娱乐,写得很不好,多多包涵。 目的: 手机、被控继电器模块连接家里路由器,通过手机App控制继电器的开与断,可设置三种定时模式,即延时开、工作时间、关闭延时。可以控制单一继电器通断或者同时通断。例如,根据配置,可以控制热水器(双刀控制,主要怕漏电)... 阅读详情

相关推荐

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

算法-3 区间求和

整体 数组不变,区间查询:前缀和、树状数组、线段树; 数组单点修改,区间查询:树状数组、线段树; 数组区间修改,单点查询:差分、线段树; 数组区间修改,区间查询:线段树 1 前缀和 下标从1开始,好处理边界问题 一维前缀和 sum[i] = sum[i-1] + a[i] 二维前缀和 sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + matrix[i - 1][j - 1]; 2 差分 一维差分 在区间[l,r]中让数列都增加C

Prince_H_23的博客 583

python爬取巨潮资讯网所有股票年报数据

爬虫获取巨潮资讯网数据

qq_42752524的博客 6110

数组的区间和

数组的区间和 输入一个无序的数组nums,然后可以在O(1)的时间复杂度给出区间iii到jjj之间的元素和。 例如: 数组nums = [1,2,3,4,2,3,1],查询区间下标为1到3之间的元素的和,则返回sum = 2+3+4 = 9。 如果排序的话,原来的下标之间的相对关系就变了,维护这个相对关系也是十分复杂的,因此排序是不能排序了。 看到O(1)时间复杂度,想到的应该是类似Ha...

Spground 5628

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2134

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1176

51nod1680:区间求和(BIT & dp)

有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和。这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求  ∑nk=1∑n−k+1i=1∑nj=i+k−1  区间前K大和 Input 输入五个数n,a1,A,B,C。a1表示第一个数,A,B,C用来生成其余n-1个数。a(i)=(a(i-1)*A+B)mod C。1 Output

junior19的博客 625

MIKE水动力笔记13_数字化海图2之克里金插值

在进行MIKE水动力建模之初,需要准备好水深数据,本专题系列博文主要讲解如何将扫描版JPG格式海图数据在ArcGIS中进行数字化并制作成xyz水深地形数据,用的克里金插值方法,仅供参考。

晏长街的博客 2879

前缀和处理数组区间之和问题

区间和问题”通常指的是涉及计算或处理数组或数列某个子区间(即一段连续元素)的总和的类型问题。这类问题可能有多种变体和不同的复杂度,但基本思想都是在给定的区间内快速计算总和或处理与区间和相关的操作。

weixin_45861152的博客 760

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 741

JEDEC JESD51-14 瞬态双界面测试方法详解

(瞬态双界面测试方法,用于测量具有单路径热流的半导体器件的结到壳热阻 RθJC,包括结到壳顶部 RθJCT 和结到壳底部 RθJCB)。该标准于 2010 年发布(版本 JESD51-14.1),旨在提供一种准确、可重复的瞬态方法来测量功率半导体器件(如 MOSFET、IGBT)的结到壳热阻(RthJC),取代传统的稳态测量方法(如 MIL-STD-883E METHOD 1012.1)。方法,通过比较两种不同热界面材料(TIM)下的瞬态温度响应曲线,提取 RthJC,而无需直接测量壳温(Tc)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 604

Python:每日一题之区间修改、区间求和(一维数组)

第 2 行包含 N 个非负整数 a1​,a2​,...,aN​,表示数组 a 元素的初值。给定一个长度为 N 的数组 a,其初值分别为 a1​,a2​,...,aN​。输入第 1 行包含两个正整数 N,Q,分别表示数组 a 的长度和操作的个数。输出共 Q 行,每行包含一个整数,表示相应查询的答案。

qq_65144447的博客 681

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2197

51nod1680 区间求和

有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和。这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求 ∑nk=1∑n−k+1i=1∑nj=i+k−1 区间前K大和 Input 输入五个数n,a1,A,B,C。a1表示第一个数,A,B,C用来生成其余n-1个数。a(i)=(a(i-1)*A+B)modC。1<=n<=1...

weixin_30315905的博客 177

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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\)...

weixin_30710457的博客 75

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

不妨考虑已知一个区间[l,r]的k=1、k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为ans + (c+1)*a[i] + s ,c为[l,r]中小于等于a[i]的数的个数,s为大于它的树的和 接下来考虑一个区间组,区间组i表示的是以i为结尾的所有区间 另dp[i]表示[...

weixin_34149796的博客 106

51Nod 1712 区间求和

推式子是的,努力推式子即可。记需要统计答案的区间的头尾值为v,主要思想就是分不同的v来考虑。枚举v的所有区间下的最小间隔的区间,考虑区间内的数在v的所有跨过这个区间的大区间的贡献即可。注意中间端点的答案会被统计两次,需要减掉……(刚开始没注意到这一点然后WA飞啦)#include<cstdio> #include<cstring> #define N 1000005 #define uint un

无尽 501

二维数组区间求和

二维数组求指定范围内的子二维数组元素和, 算法改进

2301_77713282的博客 728

求数组的区间和

Life's a struggle 1475

【算法时间复杂度分析】

文章目录 for(i=1;i<=n;i++) //n+1 for(j=1;j<=i;j++) // for(k=1;k<=j;k++) x=x+1; 语句频度: ∑i=1n∑j=1i∑k=1j1=∑i=1n∑j=1ij=∑i=1ni(i+1)2\sum_{i=1}^{n}\sum_{j=1}^{i} \sum_{k=1}^{j}1 =\sum_{i=1}^{n}\sum_{j=1}^{i}j=\sum_{i=1}^{n} \frac{i(i+1

weixin_45321631的博客 756

区间求和(利用数组)

链接:https://ac.nowcoder.com/acm/contest/5477/F 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 天才程序员菜哭武和石头组队参加一个叫做国际排列计算竞赛 (International Competition of Permutation Calculation, ICPC) 的比赛,这个比赛的规则是这样的: 一个选手给出一个长度为 n 的排列,

Ditto_xff的博客 1317

算法求解-数组求和

数组求和 二分递归 算法:分而治之 sum(int A[], int lo,int hi) //区间范围,入口形式为sum(A,0,n-1) { if(lo==hi) return A[lo]; int mi=(lo+hi)/2; return sum(A,lo,mi)+sum(A,mi+1,hi); } T(n)=各层递归实列所需时间和 =O(1)∗(20+21+22+23+⋯+2(log2n)) =O(1)*(2^0+2^1+2^2+2^3+\cdot

weixin_44887200的博客 412

树状数组 区间加 区间求和_02 创建数组

上一小节我们学习了先创建一个序列型对象,再基于此生成一个数组。但是这样也有一定的局限性,因为如果我们创建的数组比较大,比方说100×100的大小,那就有点麻烦了。实际上,Numpy内置了很多创建数组的方式,除了上一小节我们讲解的方法外,Numpy还提供了快速创建等差数组、等比数组、随机数数组等方法。创建等差数组arange()方法如果让大家创建一个等差列表,从1到100,一共100项,那...

weixin_39816141的博客 185

二维树状数组(模板,单点更新区间求和)

updata:在(x,y)处加上v query:区间(0,0)到(x,y)的所有数之和 sum:容斥原理求区间所有数之和,(x,y)左上角,(xx,yy)右下角。坐标是从左往右,从上往下增大。 int N; int c[maxn][maxn]; inline int lowbit(int t) { return t&amp;(-t); } void update(int x,int ...

HumveeA6的博客 498
上一篇: 序列求和V2
下一篇: 超级读入&输出优化
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值