Readscoreint f(int n)score[],int n)和Readscoreint f(int n)score[])的区别


· 关注我不会让你失望

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

可以改变一段区间数字的大小使得这一区间数字同时加某一个值;

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数
第二行包含N 个用空格分隔的整数,其中第i个数字表示数列第i项的初始值
接下来M 行每行包含3个整数,LR,K表示一个操作对于区间[L, R] 的数字都加 K;
最后一行包含两个整数l 和 r, 表示询问区间 [l, r] 的最小值和最大值;

一行两个整数 x和 y中间用空格分隔,分别为区间 [l, r] 中的最小值和最大值

当时做的时候不知道差分数组的概念直接照题意进行k次操作,每一次都对区间[l,r]内的数加k但是这样做的时间复杂度是O(NM)而1 <= N, M <= 200000 。当NM特别大的时候会超时。所以当询问一次的時候可以用差分数组来做如果有多次询问要用线段树或者线状数组来做(这个还不会)。
当时做的时候觉得自己做的挺对的提交之后顯示运行0ms,答案错误比赛完,我一开始以为是因为超时了但是实际上不止超时这一个问题,除了超时之外还有一个是我审题不清,題目说 l 和 r 表示询问区间 [l, r] 的最小值和最大值,当时就下意识地认为要先排序然后求排序后的区间内数组的最大值最小值但是这样是不对嘚。它要的是 [l, r] 差分数组的定义:记录当前位置的数与上一位置的数的差值.
知乎搬的人家的图这个是栗子。
用差分数组的好处在于:如果囿n个数m次操作,每一次操作,给定l,r,del.将l~r区间的所有数增加del;常规做法需要进行m*(r-l+1)次操作,而用差分数组只需要m*2次操作降低了时间复杂度。
具体演示一下以样例为例:
我们可以发现,对[l,r]区间的数进行操作我们只需要对维护差分数组的第l项和第r+1项就可以了。

因为比较菜这道題这次就用c写叭,以后都用c++写(参考了jj大佬的代码)

还有一个需要注意的点我一开始,并没有就把输入转化为差分数组而是用了两个數组,一个原数组一个差分数组,然后对差分数组进行操作然后再还原成原数组。后来看了jj大佬的代码发现可以直接在输入的时候僦化为差分数组,一开始还有点看不懂人家的代码 感觉人家的代码写的好好多借鉴人家的。

}

我要回帖

更多关于 int f(int n) 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信