当前位置: 首页 > news >正文

Educational Codeforces Round 171

Educational Codeforces Round 171

D. Sums of Segments

在这里插入图片描述
在这里插入图片描述

定义四个前缀和:

s i = a 1 + a 2 + ⋯ + a i s_i=a_1+a_2+\dots+a_i si=a1+a2++ai

u i = s 1 + s 2 + ⋯ + s i u_i=s_1+s_2+\dots+s_i ui=s1+s2++si

t i = s ( i , i ) + s ( i , i + 1 ) + ⋯ + s ( i , n ) t_i=s(i,i)+s(i,i+1)+\dots+s(i,n) ti=s(i,i)+s(i,i+1)++s(i,n)

t s i = t 1 + t 2 + ⋯ + t i ts_i=t_1+t_2+\dots+t_i tsi=t1+t2++ti

s i s_i si a i a_i ai的前缀和, u i u_i ui s i s_i si的前缀和, t i t_i ti为分块之后第 i i i块的和, t s i ts_i tsi t i t_i ti的前缀和,也是分块之后的前缀和

b b b数组中第 k k k块的个数是 n − k + 1 n-k+1 nk+1,前 k k k块的总数为 n k − k ( k − 1 ) 2 nk-\frac{k(k-1)}{2} nk2k(k1)

由前 k k k块的总数可以二分,定位到 l , r l,r l,r的块数,假定分别 x , y x,y x,y

此时和 s u m = t s y − t s x − 1 sum=ts_{y}-ts_{x-1} sum=tsytsx1,还需要减去在 x , y x,y x,y块中多加的

此时需要求位置 l , r l,r l,r在块中的第几个

设第 l , r l,r l,r个元素是 s ( x , z ) , s ( y , w ) s(x,z),s(y,w) s(x,z),s(y,w),由于位置 x n − x ( x − 1 ) 2 xn-\frac{x(x-1)}{2} xn2x(x1)上的元素是 s ( x , n ) s(x,n) s(x,n),则有

n − z = x n − x ( x − 1 ) 2 − l n-z=xn-\frac{x(x-1)}{2}-l nz=xn2x(x1)l,可得: z = n − x n − x ( x − 1 ) 2 + l z=n-xn-\frac{x(x-1)}{2}+l z=nxn2x(x1)+l

同理: w = n − y n − y ( y − 1 ) 2 + r w=n-yn-\frac{y(y-1)}{2}+r w=nyn2y(y1)+r

然后删去多出来的部分

对于第 x x x块,位置 l l l s ( x , z ) s(x,z) s(x,z),所以要去掉 s ( x , 1 ) + s ( x , 2 ) + ⋯ + s ( x , z − 1 ) s(x,1)+s(x,2)+\dots+s(x,z-1) s(x,1)+s(x,2)++s(x,z1),即下图中红色部分,就可以用我们前面的前缀和求取,

蓝色梯形部分为: u z − 1 − u x u_{z-1}-u_x uz1ux

橙色矩形部分为: ( x − z ) s x − 1 (x-z)s_{x-1} (xz)sx1

所以减去的红色部分为: u z − 1 − u x − ( x − z ) s x − 1 u_{z-1}-u_x-(x-z)s_{x-1} uz1ux(xz)sx1

同理可得对于第 y y y块,需要减去的部分为: u n − u w − 1 − ( n − w ) s y − 1 u_n-u_{w-1}-(n-w)s_{y-1} unuw1(nw)sy1

在这里插入图片描述

代码如下:

void solve()
{cin >> n;for(int i = 1 ; i <= n ; i ++){cin >> a[i];s[i] = s[i-1] + a[i];u[i] = u[i-1] + s[i]; }for(int i = n ; i >= 1 ; i --)t[i] = t[i+1] + (n-i+1)*a[i];for(int i = 1 ; i <= n ; i ++)ts[i] = ts[i-1] + t[i];cin >> q;while(q--){cin >> l >> r;int sum = 0;int L = 1, R = n;while(L != R){int mid = (L + R) / 2;if(n*mid-mid*(mid-1)/2 < l) L = mid + 1;else R = mid;}x = L;L = 1 , R = n;while(L != R){int mid = (L + R) / 2;if(n*mid-mid*(mid-1)/2 < r) L = mid + 1;else R = mid;}y = L;// cout << x << " " << y << " ";sum = ts[y] - ts[x-1];z = n - (x*n -x*(x-1)/2 - l);w = n - (y*n -y*(y-1)/2 - r);sum -= u[z-1] - u[x-1] - (z-x)*s[x-1];sum -= u[n]-u[w] -s[y-1]*(n-w);cout << sum << endl;}
}

http://www.mrgr.cn/news/61939.html

相关文章:

  • ‌Linux tac命令‌
  • C++学习路线(数据库部分)二
  • No.23 笔记 | WEB安全 - 任意文件漏洞 part 5
  • MySQL史上最全总结
  • 安卓取消触摸屏幕的指针效果
  • Python(pandas库3)
  • OBC充电机测试性能评估
  • Java面试经典 150 题.P88. 合并两个有序数组(001)
  • 【C++】string 类深度解析:探秘字符串操作的核心
  • python公寓出租管理系统-计算机毕业设计源码00130
  • 项目开发的架构模式与异步请求(AJAX)
  • 香橙派Orangepi 5plus 配置Hailo-8/Hailo-8L
  • 2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境搭建
  • 荒野大镖客:救赎 PC版整合包
  • 【K8S系列】Kubernetes 中 NodePort 类型的 Service 无法访问的问题【已解决】
  • 基于安卓Android的助农商城系统APP(源码+文档+部署+讲解)
  • Rust 力扣 - 54. 螺旋矩阵
  • 数据结构算法学习方法经验总结
  • git快速合并代码dev->master
  • ECharts 折线图 / 柱状图 ,通用配置标注示例
  • JAVA基础-Map集合
  • 三格电子——RS485转光纤点对点式【MS-F155-M】
  • 数据结构与算法——(Hash)哈希表与哈希算法
  • 【生物学&水族馆】金鱼成体幼苗检测活体识别系统源码&数据集全套:改进yolo11-Parc
  • 打工人不上班之后,躺平还是躺赢?
  • 数据结构和算法-动态规划(3)-经典问题