【CSP考题扩展】前缀和/差分练习

2024-03-16 00:12

本文主要是介绍【CSP考题扩展】前缀和/差分练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【深进1.例1 求区间和】

题目描述

给定 n n n 个正整数组成的数列 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,a2,,an m m m 个区间 [ l i , r i ] [l_i,r_i] [li,ri],分别求这 m m m 个区间的区间和。

对于所有测试数据, n , m ≤ 1 0 5 , a i ≤ 1 0 4 n,m\le10^5,a_i\le 10^4 n,m105,ai104

输入格式

第一行,为一个正整数 n n n

第二行,为 n n n 个正整数 a 1 , a 2 , ⋯ , a n a_1,a_2, \cdots ,a_n a1,a2,,an

第三行,为一个正整数 m m m

接下来 m m m 行,每行为两个正整数 l i , r i l_i,r_i li,ri ,满足 1 ≤ l i ≤ r i ≤ n 1\le l_i\le r_i\le n 1lirin

输出格式

m m m 行。

i i i 行为第 i i i 组答案的询问。

1 ≤ n , m ≤ 1 0 5 1\le n, m\le 10^5 1n,m105 1 ≤ a i ≤ 1 0 4 1 \le a_i\le 10^4 1ai104

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;long long n, m, t, a, b;int main() {cin >> n;vector<int>perfix(n + 1, 0), arr(n);for (size_t i = 0; i < n; i++){cin >> arr[i];}for (size_t i = 0; i < n; i++){perfix[i + 1] = perfix[i] + arr[i];}cin >> m;for (size_t i = 0; i < m; i++){cin >> a >> b;cout << perfix[b] - perfix[a - 1] << endl;}return 0;
}

【最大加权矩形】

题目描述

为了更好的备战 NOIP2013,电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的面积就是你们能找到的这个最大的数字。

校长先给他们一个 n × n n\times n n×n 矩阵。要求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于 [ − 127 , 127 ] [-127,127] [127,127] ,例如

 0 –2 –7  0 9  2 –6  2
-4  1 –4  1 
-1  8  0 –2

在左下角:

9  2
-4  1
-1  8

和为 15 15 15

几个女孩子有点犯难了,于是就找到了电脑组精打细算的 HZH,TZY 小朋友帮忙计算,但是遗憾的是他们的答案都不一样,涉及土地的事情我们可不能含糊,你能帮忙计算出校长所给的矩形中加权和最大的矩形吗?

输入格式

第一行: n n n,接下来是 n n n n n n 列的矩阵。

输出格式

最大矩形(子矩阵)的和。

#include <iostream>
#include <vector>
#include <climits> // For INT_MIN
#include <algorithm>
using namespace std;int n, maxSum = INT_MIN;int main() {cin >> n;vector<vector<int>> matrix(n, vector<int>(n));vector<vector<int>> prefixMatrix(n + 1, vector<int>(n + 1, 0));for (auto& it : matrix) {for (auto& jt : it) {cin >> jt;}}for (size_t i = 1; i < n + 1; i++) {for (size_t j = 1; j < n + 1; j++) {prefixMatrix[i][j] = prefixMatrix[i][j - 1] + prefixMatrix[i - 1][j] - prefixMatrix[i - 1][j - 1] + matrix[i - 1][j - 1];}}// 遍历所有可能的左上角位置for (size_t i = 1; i <= n; i++) {for (size_t j = 1; j <= n; j++) {// 遍历所有可能的右下角位置for (size_t k = i; k <= n; k++) {for (size_t p = j; p <= n; p++) {// 使用前缀和矩阵计算当前矩形的和// sum 表示从 (i, j) 到 (k, p) 形成的矩形的加权和int sum = prefixMatrix[k][p] - prefixMatrix[i - 1][p] - prefixMatrix[k][j - 1] + prefixMatrix[i - 1][j - 1];// 更新最大加权和maxSum = max(maxSum, sum);}}}}cout << maxSum;return 0;
}

【语文成绩】

题目背景

语文考试结束了,成绩还是一如既往地有问题。

题目描述

语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?

输入格式

第一行有两个整数 n n n p p p,代表学生数与增加分数的次数。

第二行有 n n n 个数, a 1 ∼ a n a_1 \sim a_n a1an,代表各个学生的初始成绩。

接下来 p p p 行,每行有三个数, x x x y y y z z z,代表给第 x x x 个到第 y y y 个学生每人增加 z z z 分。

输出格式

输出仅一行,代表更改分数后,全班的最低分。

#include <iostream>
#include <vector>
#include <climits> // For INT_MIN
#include <algorithm>
using namespace std;long long n, p, x, y, z, minGrade = INT_MAX;int main() {cin >> n >> p;vector<long long>grade(n);vector<long long>diffGrade(n);vector<long long>finalGrade(n);for (size_t i = 0; i < n; i++){cin >> grade[i];}// 构建差分数组diffGrade[0] = grade[0];for (size_t i = 1; i < n; i++){diffGrade[i] = grade[i] - grade[i - 1];}// 批量增减for (size_t i = 0; i < p; i++){cin >> x >> y >> z;diffGrade[x - 1] += z;if (y < n) diffGrade[y] -= z;}// 恢复原数组finalGrade[0] = diffGrade[0];for (size_t i = 1; i < n; i++){finalGrade[i] = finalGrade[i - 1] + diffGrade[i];}for (size_t i = 0; i < n; i++){minGrade = min(minGrade, finalGrade[i]);}cout << minGrade;return 0;
}

【地毯】

题目描述

n × n n\times n n×n 的格子上有 m m m 个地毯。

给出这些地毯的信息,问每个点被多少个地毯覆盖。

输入格式

第一行,两个正整数 n , m n,m n,m。意义如题所述。

接下来 m m m 行,每行两个坐标 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2),代表一块地毯,左上角是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),右下角是 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)

输出格式

输出 n n n 行,每行 n n n 个正整数。

i i i 行第 j j j 列的正整数表示 ( i , j ) (i,j) (i,j) 这个格子被多少个地毯覆盖。

#include <iostream>
#include <vector>
using namespace std;int n, m, xx1, xx2, yy1, yy2;int main() {cin >> n >> m;vector<vector<int>>diffArea(n, vector<int>(n, 0));vector<vector<int>>resultArea(n, vector<int>(n, 0));for (size_t i = 0; i < m; i++){cin >> xx1 >> yy1 >> xx2 >> yy2;for (size_t i1 = xx1 - 1; i1 < xx2; i1++) // 将二维差分数组视为n个大小为n的一维差分数组{diffArea[i1][yy1 - 1] += 1;if (yy2 < n) diffArea[i1][yy2] -= 1;}}for (size_t i = 0; i < n; i++){resultArea[i][0] = diffArea[i][0];for (size_t j = 1; j < n; j++){resultArea[i][j] = resultArea[i][j - 1] + diffArea[i][j];}}for (auto& it : resultArea) {for (auto& jt : it) {cout << jt << " ";}cout << endl;}return 0;
}

这篇关于【CSP考题扩展】前缀和/差分练习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813727

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询