首页 > 其他分享 >语文成绩

语文成绩

时间:2024-11-17 13:30:32浏览次数:1  
标签:... 语文 前缀 差分 数组 区间 成绩

语文成绩(https://www.luogu.com.cn/record/189365158)

题目描述

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

输入格式

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

第二行有 n 个数,a1∼an,代表各个学生的初始成绩。

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

输出格式

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

样例

输入

3 2
1 1 1
1 2 1
2 3 1

**输出 **

2

说明

对于 40%的数据,有 n≤10e3

对于 60% 的数据,有 n≤10e4

对于 80%的数据,有 n≤10e5

对于 100%的数据,有 n≤5×10e6 , p≤n,学生初始成绩 ≤100,z≤100

[!TIP]

标签 题目可知,用差分解决

差分数组:

首先给定一个原数组a:a[1], a[2], a[3]...a[n];

然后再构造一个数组b : b[1], b[2], b[3]...b[i];

使得 a[i] = b[1] + b[2] + b[3] + ...+ b[i]

a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。即每一个a[i]都是b数组中从头开始的一段区间和

构造差分b数组(一维)

a[0 ]= 0;
b[1] = a[1] - a[0];
b[2] = a[2] - a[1];
b[3] = a [3] - a[2]`;
.......
b[n] = a[n] - a[n - 1];

给定区间[x, y ],把a数组中的[x, y] 区间中的每一个数都加上z,即 a[x] + z , a[x+ 1] + z , a[x + 2] + z... a[y] + z;

暴力做法是for循环x到y区间,时间复杂度O(n),如果需要对原数组执行m次这样的操作,时间复杂度就会变成O(n * m)有没有更高效的做法吗? 考虑差分做法(差分数组派上用场了)

始终要记得,a数组是b数组的前缀和数组,比如对b数组的b[i]的修改,会影响到a数组中从a[i]及往后的每一个数。

首先让差分b数组中的 b[x] + z ,通过前缀和运算,a数组变成 a[x] + z ,a[x + 1] + z...a[n] + z;

然后打个补丁,b[y + 1] - z, 通过前缀和运算,a数组变成 a[y + 1] - c,a[y + 2] - z...a[n] - z;

b[x] + z,效果使得a数组中 a[x] 及以后的数都加上了z,但只要求x到y 区间加上 z, 因此还需要执行 b[y + 1] - z,让a数组中 a[y + 1]及往后的区间再减去z,这样对于a[y] 以后区间的数相当于没有发生改变

一维差分:给a数组中的[ x, y] 区间中的每一个数都加上z,只需对差分数组b做 b[x] + = c, b[y+1] - = z时间复杂度为O(1), 大大提高了效率

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    int n, p;
    scanf("%d %d", &n, &p);

    vector<int> a(n);
    vector<int> b(n);

    for (int i = 1; i <= n; i-=-1) {
        scanf("%d", &a[i]);
    }

    for (int i = 1; i <= n; i-=-1) {
        b[i] = a[i] - a[i - 1];//构建差分数组
    }

    int x, y, z;
    for (int i = 0; i < p; i-=-1){
        scanf("%d %d %d", &x, &y, &z);
        b[x] += z; //将[x, y]之间的每个数加上z
        b[y + 1] -= z;
    }

    int baka = 1e7;
    for (int i = 1; i <= n; i-=-1) {
        a[i] = a[i - 1] + b[i];
        if (baka > a[i]) {
            baka = a[i];
        }
    }

    printf("%d\n", baka);

    return 0;
}




标签:...,语文,前缀,差分,数组,区间,成绩
From: https://www.cnblogs.com/gailixia/p/18550455

相关文章

  • ssm124田径运动会成绩管理系统的设计与实现+vue(论文+源码)_kaic
     毕业设计(论文)  田径运动会成绩管理系统的设计与实现学生姓名   XXX                        学    号   XXXXXXXX          分院名称   XXXXXXXX          专业班级   XXX......
  • ssm125四六级报名与成绩查询系统+jsp(论文+源码)_kaic
     毕业设计(论文)题目:四六级报名与成绩查询系统的设计与实现      摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混......
  • 基于ssm+vue.js体育竞赛成绩管理系统的附带文章源码部署视频讲解等
    文章目录前言详细视频演示具体实现截图核心技术介绍后端框架SSM前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言......
  • JavaScript题目一 根据成绩给出学生考评
            根据学生的成绩给出考评,可以通过if或switch语句来实现。下面是一个简单的JavaScript代码示例,根据学生的成绩返回不同的评语。示例代码:functionevaluateStudent(score){letevaluation;if(score>=90){evaluation='优秀';}else......
  • C小题目:有一个一维数组score,放10个学生的成绩,求平均成绩。
    #include<stdio.h>intaverage(intx[],intlen){inti,sum=0;for(i=0;i<len;i++){sum+=x[i];printf("%d\n",x[i]);};inta=sum/len;printf("theaverageis%d\n",a);};intmain(){......
  • 教资成绩出来了,果然没有全过
    教师资格证考试成绩出来了,有一科没有过,出乎我的意料,我以为全军覆没了。马上38了,自己也算大龄程序员了。所以今年开始就一直在考虑退路了。思来想去,关注到了信奥这个赛道。4月份公众号开始发信奥相关的文章,也在教资报名的时候去报了个名,想着有个教资证书,也能给自己教学生带来一......
  • 【Python期末/课程设计】高校成绩管理系统(PyCharm项目/flask框架/MySQL数据库)
    代写C语言、C++、Java、Python、HTML、JavaScript、vue、MySQL相关编程作业,长期接单,信誉有保证,如有需要请加推广QQ。本文资源:【Python期末/课程设计】高校成绩管理系统(PyCharm项目/flask框架/MySQL数据库)1.题目要求题目描述:无编程软件:2.视频演示【Python期......
  • 【C++练习】判断成绩是否恰好有一门不及格
    题目:判断成绩是否恰好有一门不及格描述:编写一个程序,输入学生的语文和数学成绩,判断该学生是否恰好有一门课不及格(不及格的标准是成绩低于60分)。如果恰好有一门课不及格,则输出1;如果没有课程不及格或者两门课都不及格,则输出0。输入:输入两个整数,分别表示语文成绩和数学成绩。......
  • 7-3 找成绩
    给定n个同学的m门课程成绩,要求找出总分排列第k名(保证没有相同总分)的同学,并依次输出该同学的m门课程的成绩。输入格式:首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试包含两部分,第一行输入3个整数n、m和k(2≤n≤10,3≤m≤5,1≤k≤n);接下来的n行,每行输入m个百......
  • 求成绩最值
    #include<stdio.h从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时循环结束。。输入格式:在一行中输入若干个用空格间隔的整数(不要超过15个数),最后输入负数结束输入,数据之间只能用1个空格间隔。输出格式:在一行中按照“max=最高分,min=最低分”的格式输......